我正在用 D 编写一个目录树扫描函数,它尝试将 grep 和 file 等工具结合起来,并且仅当文件中的内容满足条件时才对文件中的内容进行条件 grepnot匹配一组指示文件类型的魔术字节,例如 ELF、图像等。
在最小化文件 io 方面,使此类排除逻辑尽可能快地运行的最佳方法是什么?如果我只需要在开头读取一些魔术字节,我通常不想读取整个文件。然而,为了使代码更具未来通用性(一些魔法可能位于末尾或其他地方而不是开头),如果我可以使用类似 mmap 的接口仅在需要时才从磁盘中延迟获取数据,那就太好了读。数组接口还简化了我的算法。
Is D's std.mmfile
在这种情况下最好的选择是什么?
Update:根据这篇文章,我猜建议使用 mmap:http://forum.dlang.org/thread/[电子邮件受保护] http://forum.dlang.org/thread/dlrwzrydzjusjlowavuc@forum.dlang.org
如果我只需要作为数组(opIndex)进行读取访问,那么使用有什么缺点std.mmfile
over std.stdio.File
or std.file
?
如果你想用 Phobos 懒惰地读取文件,你几乎有三个选择
Use std.stdio.File
's byLine
并一次读一行。
Use std.stdio.File
's byChunk
并一次读取特定数量的字节。
Use std.mmfile.MmFile
并将文件作为数组进行操作,利用mmap
在引擎盖下以避免读取整个文件。
我完全预计#3 将是最快的(分析可能会有所不同,但考虑到它的出色程度,我会感到非常惊讶mmap
是)。它也可能是最容易使用的,因为您可以操作一个数组。唯一的问题是MmFile
我知道的是,它是一个类,可以说它应该是一个引用计数的结构,以便在完成后它会自行清理。现在,如果您不想等待 GC 清理它,您必须手动调用unmap
在其上或使用destroy
销毁它而不释放它的内存(尽管destroy
应谨慎使用)。使用可能有一些缺点mmap
(这自然意味着使用有一个缺点MmFile
),但我不知道。
将来,我们最终将得到一些基于范围的流 I/O 内容,这可能更接近您需要的内容,而无需实际使用mmap
,但这还没有完成,并且mmap
非常酷,很有可能使用它会更好MmFile
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)