我正在开发一个程序,将要处理可能大小为100GB或更大的文件。这些文件包含了长度可变的多组记录。我已经完成了第一个实现,并且现在致力于提高性能,特别是在更有效地进行I/O操作方面,因为输入文件需要被扫描多次。
有没有一些使用mmap()
和C++的fstream
库读取块的经验法则?我的想法是从磁盘中读取大块到缓冲区,从缓冲区处理完整的记录,然后再读取更多。
mmap()
代码可能会变得非常混乱,因为mmap
的块需要位于页面大小的边界上(据我所知),而记录可能潜在地跨越页面边界。通过使用fstream
s,我可以直接寻找记录的起点并开始读取,因为我们不受限于只读取位于页面大小的边界上的块。
在实际编写一个完整实现之前,如何在这两个选项之间做出选择?是否有什么经验法则(例如,mmap()
速度是2倍)或简单测试?
mmap()
比使用系统调用(例如read()
)快2-6倍。 - mplattner