0

While processing a very large binary file can using memory mapping in C make any difference when compared to fread ? Even if there are small differences in time it would be fine. And if it does make the process fsater any idea how to use memory mapping on a large binary file and extract data from it ?

Thanks!!

4

1 回答 1

2

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

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

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

但是,使用内存映射,您将保存副本,假设您无论如何都不需要进行复制。如果您出于任何原因必须从映射的页面中复制出来,那么您不妨让read操作将它们复制到适当的位置。但是,如果您可以对数据进行操作,那么内存映射可能是一个胜利。

它通常不会像人们认为的那样有很大的不同。尤其是当您考虑与所有这些东西相比磁盘有多慢时。

于 2012-04-15T04:48:42.860 回答