我需要从3.7 GB文件读取小数据序列。我需要读取的位置是不是相邻的,但我可以对IO进行排序,以便从头到尾读取文件。如何利用磁盘IO排队
该文件存储在应能够处理/优化排队IO的iSCSI SAN上。
问题是,如何一次性完成我需要的所有数据/职位的一次性请求?可能吗?我不认为异步IO是一种选择,因为阅读是非常小的(20-200字节)
目前的代码如下所示:
using (var fileStream = new FileStream(dataStorePath, FileMode.Open, FileAccess.Read, FileShare.Read))
{
for (int i = 0; i < internalIds.Count();i++)
{
fileStream.Position = seekPositions[i].SeekPosition;
... = Serializer.DeserializeWithLengthPrefix<...>(fileStream, PrefixStyle.Base128);
}
...
}
我在寻找各种方法来改善这个我/ O,因为我的表现有所降低。移动头部的所有寻求时间似乎都在增加。
+1了解问题。我相信这就是发生了什么,在第二次读取需要完成时,磁盘已经旋转,因此我正在寻找一种方法来执行硬件排队。 – andreialecu 2009-08-21 08:11:09
我原以为Windows会为你处理硬件排队。 C#基础上的硬盘肯定无法获得中世纪的成就。你只能说“去这里读X字节”。我将尝试使用多个线程的不同访问模式。如果2个线程读取A和B,然后读取C和D,也许会更快;或者可能是A和M,然后是B和N. – 2009-08-25 02:54:36
ReadFileScatter API听起来很有前途。我的答案中添加了一个blurb。 – 2009-09-16 19:38:41