我正在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
是否有任何缺点?
答案 0 :(得分:3)
如果你想懒惰地阅读Phobos文件,你几乎有三个选择
使用std.stdio.File
的{{1}}并一次阅读一行。
使用byLine
的{{1}}并一次读取特定数量的字节。
使用std.stdio.File
并将该文件作为数组运行,利用引擎盖下的byChunk
来避免读取整个文件。
我完全相信#3会变得最快(分析可能会有所不同,但鉴于std.mmfile.MmFile
有多么奇妙,我会感到非常惊讶)。它也可能是最容易使用的,因为你可以使用一个阵列进行操作。我所知道的mmap
的唯一问题是,当它应该被认为是一个重新计算的结构时,它就是一个类,以便它在你完成时自我清理。现在,如果您不想等待GC清理它,您必须手动调用mmap
或使用MmFile
销毁它而不释放其内存(尽管{ {1}}应谨慎使用)。使用unmap
可能会有某种缺点(这自然意味着使用destroy
有一个缺点),但我不知道。
将来,我们将最终得到一些基于范围的流式I / O内容,这些内容可能更接近您所需的内容而不实际使用destroy
,但尚未完成,mmap
非常酷,很有可能使用MmFile
更好。
答案 1 :(得分:3)
您可以合并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一样快,但多次搜索会破坏预读行为