3

我在 D 中编写了一个目录树扫描函数,它试图结合诸如 grep 和 file 之类的工具,并且只有当它匹配一组指示文件类型(如 ELF、图像等)的魔术字节时,才有条件地 grep 文件中的内容。

在最小化文件 io 方面,使这种排除逻辑尽可能快地运行的最佳方法是什么?如果我只需要在开始时读取一些魔术字节,我通常不想读取整个文件。但是,为了使代码更具未来通用性(一些魔法可能位于末尾或其他地方而不是开头),如果我可以使用类似 mmap 的接口仅当我是读。数组接口也简化了我的算法。

在这种情况下, D 是std.mmfile最佳选择吗?

更新:根据这篇文章,我想建议使用 mmap:http: //forum.dlang.org/thread/dlrwzrydzjusjlowavuc@forum.dlang.org

如果我只需要作为数组(opIndex)进行读取访问,使用std.mmfileoverstd.stdio.File或有什么缺点std.file吗?

4

2 回答 2

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 一样快,但是多次查找会破坏预读行为

于 2013-09-19T10:00:21.067 回答
3

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

  1. 使用std.stdio.File'sbyLine并一次读取一行。

  2. 使用std.stdio.File'sbyChunk并一次读取特定数量的字节。

  3. 将文件作为数组使用std.mmfile.MmFile和操作,利用mmap底层特性避免读取整个文件。

我完全期望#3 将是最快的(配置文件可能会有所不同,但考虑到这有多棒,我会感到非常惊讶mmap)。它也可能是最容易使用的,因为你得到一个数组来操作。我知道的唯一问题MmFile是它是一个类,当它可以说是一个引用计数的结构时,它会在你完成后自行清理。现在,如果您不想等待 GC 清理它,则必须手动调用unmap它或使用它destroy来销毁它而不释放它的内存(尽管destroy应该谨慎使用)。使用可能有某种缺点mmap(这自然意味着使用有缺点MmFile),但我不知道有任何缺点。

将来,我们将最终得到一些基于范围的流式 I/O 的东西,这可能更接近于你不需要实际使用的东西mmap,但这还没有完成,而且mmap非常酷,以至于有很有可能使用它仍然会更好MmFile

于 2013-09-19T09:10:30.343 回答