我正在开发一个程序,该程序将处理可能大小为100GB或更大的文件.这些文件包含一组可变长度记录.我已经启动并运行了第一个实现,现在我正在寻求提高性能,特别是在输入文件被多次扫描时更有效地进行I/O.
mmap()通过C++的fstream库使用和读取块有经验吗?我想做的是从磁盘读取大块到缓冲区,从缓冲区处理完整记录,然后阅读更多.
该mmap()代码可能会变得非常凌乱,因为mmap"d块需要躺在页大小的边界(我的理解)和记录可能潜在般划过页面边界.使用fstreams,我可以寻找记录的开头并再次开始阅读,因为我们不仅限于阅读位于页面大小边界的块.
如何在不实际编写完整实现的情况下决定这两个选项?任何经验法则(例如,mmap()快2倍)或简单测试?
我在C中编写了一个批量ID3标签编辑器.ID3标签通常位于mp3编码文件的开头,尽管旧的(版本1)标签在最后.该应用程序旨在从命令行接受目录和帧ID列表,然后递归目录结构,更新它找到的所有ID3标记.用户可另外选择删除所有旧(版本1)标签.另一种选择是简单地显示当前标签,而不执行更新.该目录可能包含2个文件或200万个文件.如果用户意味着更新文件,我打算将整个文件加载到内存中,执行更新,然后保存(文件也可以重命名).但是,如果用户仅表示打印当前的ID3标签,则加载整个文件似乎过多.毕竟文件可能是200mb.
我已经阅读了这个线程,这是有见地的 - mmap()与阅读块
所以我的问题是,最有效的方法是什么 - read(),mmap()或某种组合?欢迎设计理念.
TIA,
安德鲁
编辑:我的理解是mmap基本上委托将文件加载到内存中,并加载到虚拟内存子系统.在我看来,VMM将在大多数系统上进行高度优化,因为它对系统性能至关重要.