【发布时间】:2011-04-07 22:59:06
【问题描述】:
我正在用 C 语言编写一个批量 ID3 标签编辑器。ID3 标签通常位于 mp3 编码文件的开头,尽管较旧的(版本 1)标签位于末尾。该应用程序旨在从命令行接受目录和框架 ID 列表,然后递归目录结构以更新它找到的所有 ID3 标记。用户还可以选择删除所有旧的(版本 1)标签。另一种选择是简单地显示当前标签,而不执行更新。该目录可能包含 2 个文件或 200 万个文件。如果用户打算更新文件,我打算将整个文件加载到内存中,执行更新,然后保存(文件也可能被重命名)。但是,如果用户只想打印当前的 ID3 标签,那么加载整个文件似乎是多余的。毕竟文件可能是200mb。
我已经阅读了这篇文章,很有见地 - mmap() vs. reading blocks
所以我的问题是,最有效的方法是什么——read()、mmap() 或某种组合?欢迎设计创意。
编辑:据我了解,mmap 本质上是将文件加载到内存中,委托给虚拟内存子系统。在我看来,VMM 将在大多数系统上进行高度优化,因为它对系统性能至关重要。
【问题讨论】:
-
FWIW,文件读取也非常优化,因为它对性能也很重要。
mmap()对于随机访问往往稍快,read()对于块/流访问往往更快(或至少足够快)。读写mmap()将使就地更新标签变得更快、更容易,如果你想这样做的话——因为你只需要映射标签区域并且写入有效地直接到磁盘缓冲区。