我有一个类,使用FileStream
从大文件一次一行地读取图像数据。在内部,文件被分成几个块,每个块看起来像这样:
================= | Header | ================= | Data I Want | ================= | Data I Ignore | =================
为了读取一行数据,我计算哪个块具有我想要的行,Seek()
到适当的偏移量,并读取固定数量的字节。当从一个块中读取多个行时,我实际上可以跳过所有Seek()
个调用但是第一个,因为指针已经在Read()
之后已经到达我想要的位置。但是当我跳到一个新的块时我需要Seek()
。为简单起见,我总是使用Seek()
计算文件中下一行的绝对偏移量,并计算SeekOrigin.Begin
到它的绝对偏移量。 FileStream.Seek()
(或基础SetFilePointer()
原生函数)是否经过优化以识别给定的搜索是否为无操作?如果没有,我应该优化我自己的代码,因为它不是完全闪电般的。
答案 0 :(得分:1)
如果您在这里查看FileStream.Seek源代码: http://referencesource.microsoft.com/#mscorlib/system/io/filestream.cs,329c77a859ac60bd
您可以看到,无论文件指针的旧位置如何,都会调用SeekCore方法,该方法本身调用Win32Native.SetFilePointer,这是一个内核调用。
所以答案是否定的,它没有经过优化,如果可以的话,你应该自己优化它。
答案 1 :(得分:1)
答案似乎是肯定的。
这里唯一关心的是读缓冲区。我们可以假设底层的SetFilePointer()调用将是一个非搜索到当前的操作。
当您查阅source for Seek时,您可以看到尝试尽可能多地保留读取缓冲区。