懒惰地阅读D中的文件

时间:2013-09-19 07:27:18

标签: file-io lazy-loading d mmap

我正在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.Filestd.file是否有任何缺点?

2 个答案:

答案 0 :(得分:3)

如果你想懒惰地阅读Phobos文件,你几乎有三个选择

  1. 使用std.stdio.File的{​​{1}}并一次阅读一行。

  2. 使用byLine的{​​{1}}并一次读取特定数量的字节。

  3. 使用std.stdio.File并将该文件作为数组运行,利用引擎盖下的byChunk来避免读取整个文件。

  4. 我完全相信#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一样快,但多次搜索会破坏预读行为