在C中使用内存映射来读取二进制文件

时间:2012-04-15 04:07:17

标签: c binary memory-mapped-files

虽然处理一个非常大的二进制文件可以使用C中的内存映射与fread相比有什么不同?即使时间差异很小也没关系。如果它确实使进程更好地了解如何在大型二进制文件上使用内存映射并从中提取数据?

谢谢!

1 个答案:

答案 0 :(得分:2)

如果您要从头到尾阅读整个文件,最重要的是让平台知道这一点。这将允许它进行积极的预读,并且它将允许它避免使用无法再次读取的数据来污染缓存。您可以使用内存映射或不使用内存映射来执行此操作。关键功能是posix_fadviseposix_madvise

当你有随机的小访问时,内存映射是一个巨大的胜利。当您对同一页面进行多次写入时尤其如此。没有内存映射,每次读取或写入都需要用户/内核转换和副本。使用内存映射,大多数操作都没有。

但是通过顺序访问,所有将保存的是副本。奇怪的是,用户/内核转换可能更糟糕。对于大型顺序读取,每次读取将获得一个用户/内核转换,如果读取很大,则可以是每256KB。通过对内存映射文件的大型顺序访问,每个页面都可能出错(4KB)。这取决于内核的“错误提前”优化。

但是,对于内存映射,您将保存副本,假设您无需进行复制。如果由于任何原因必须复制出映射的页面,那么您也可以让read操作将它们复制到适当的位置。但是,如果您可以对数据进行操作,则内​​存映射可能会获胜。

它通常不会像人们认为的那样产生差异。特别是当你想到磁盘与所有这些东西相比有多慢时。