[英]Lazily Reading a File in D
我在D中编写了一个目录树扫描函数,它试图将文件中的grep和file以及有条件grep等工具组合在一起,只要它不匹配一组指示文件类型的魔术字节,如ELF,图像等。
在最小化文件io方面,尽可能快地运行这种排除逻辑的最佳方法是什么? 如果我只需要在开头读取一些魔术字节,我通常不想读取整个文件。 然而,要使代码更具未来性(一些魔法可能位于最后或其他地方而不是开头),如果我可以使用类似mmap的接口来懒惰地从磁盘获取数据,那将是很好的读。 阵列接口也简化了我的算法。
在这种情况下,D的std.mmfile
是最好的选择吗?
更新 :根据这篇文章,我想mmap建议: http : //forum.dlang.org/thread/dlrwzrydzjusjlowavuc@forum.dlang.org
如果我只需要读访问作为数组(opIndex)是否有任何缺点,使用std.mmfile
在std.stdio.File
或std.file
?
如果你想懒惰地阅读Phobos文件,你几乎有三个选择
使用std.stdio.File
的byLine
并一次读取一行。
使用std.stdio.File
的byChunk
并一次读取特定数量的字节。
使用std.mmfile.MmFile
并将该文件作为一个数组运行,利用std.mmfile.MmFile
的mmap
来避免读取整个文件。
我完全相信#3会变得最快(分析可能会有所不同,但考虑到mmap
精彩程度,我会非常惊讶)。 它也可能是最容易使用的,因为你可以使用一个阵列进行操作。 我所知道的MmFile
的唯一问题是,当它应该被认为是一个重新计算的结构时它是一个类,以便它在你完成时自我清理。 现在,如果你不想等待GC清理它,你必须手动调用它上面的unmap
或使用destroy
来销毁它而不释放它的内存(虽然应该谨慎使用destroy
)。 使用mmap
可能会有某种缺点(这自然意味着使用MmFile
有一个缺点),但我不知道任何。
在未来,我们将最终得到一些基于范围的流式I / O内容,这可能更接近您所需要的而不实际使用mmap
,但尚未完成,而且mmap
非常酷使用MmFile
。
你可以结合seek
和rawread
的std.stdio.File
做你想做什么
然后,您可以只为前几个字节执行rawRead
File file=//...
ubyte[1024] buff;
ubtye[] magic=file.rawRead(buff[0..4]);//only the first 4 bytes are read
//check magic
然后根据操作系统的缓存/预读策略,这几乎和mmfile一样快,但多次搜索会破坏预读行为
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.