我需要从 3.7 GB 文件中读取小数据序列。我需要阅读的职位是不相邻,但我可以命令 IO 以便从头到尾读取文件。
该文件存储在 iSCSI SAN 上,该 SAN 应该能够处理/优化排队 IO。
问题是,如何一次性请求我需要的所有数据/位置?是否可以?我不认为异步 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);
}
...
}
我正在寻找改进此 I/O 的方法,因为我的读取性能有些低于标准。移动磁头的所有寻道时间似乎都在增加。
你跑了吗性能监视器 http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx(来自 Microsoft Sysinternals)对此?
我不确定问题是什么,但我会猜测一下。如果您从 SAN 读取数据,我认为磁盘访问会在幕后产生网络请求。第一次读取发送请求来查找、读取并缓冲数据,然后序列化器构造对象。当您发送第二个请求时,SAN 磁盘已继续旋转,因此您必须等待数据旋转到位。
您尝试过多线程吗?我很好奇如果您设置一个需要按顺序处理的文件部分队列,启动一些线程,让它们分别打开文件(FileSharing.Read,以便它们可以同时访问该文件)并且然后让他们开始从队列中获取工作。将结果输出到另一个集合中。如果顺序对输出很重要,则可以按原始排队顺序对输出进行排序。
- - 编辑 - -
你有没有尝试过读取文件分散 API http://msdn.microsoft.com/en-us/library/aa365469(VS.85).aspx? 这是来自 pinvoke.net 的 P-invoke 签名 http://www.pinvoke.net/default.aspx/kernel32/ReadFileScatter.html.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)