繁体   English   中英

懒惰地阅读D中的文件

[英]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.mmfilestd.stdio.Filestd.file

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

  1. 使用std.stdio.FilebyLine并一次读取一行。

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

  3. 使用std.mmfile.MmFile并将该文件作为一个数组运行,利用std.mmfile.MmFilemmap来避免读取整个文件。

我完全相信#3会变得最快(分析可能会有所不同,但考虑到mmap精彩程度,我会非常惊讶)。 它也可能是最容易使用的,因为你可以使用一个阵列进行操作。 我所知道的MmFile的唯一问题是,当它应该被认为是一个重新计算的结构时它是一个类,以便它在你完成时自我清理。 现在,如果你不想等待GC清理它,你必须手动调用它上面的unmap或使用destroy来销毁它而不释放它的内存(虽然应该谨慎使用destroy )。 使用mmap可能会有某种缺点(这自然意味着使用MmFile有一个缺点),但我不知道任何。

在未来,我们将最终得到一些基于范围的流式I / O内容,这可能更接近您所需要的而不实际使用mmap ,但尚未完成,而且mmap非常酷使用MmFile

你可以结合seekrawreadstd.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM