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



在处理非常大的二进制文件时,与fread相比,在C中使用内存映射会有什么不同吗?即使时间差异很小,也没关系。如果它确实使进程变得fsater知道如何在大型二进制文件上使用内存映射并从中提取数据?

谢谢!!

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

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

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

但是,使用内存映射,您将保存副本,假设您无论如何都不需要执行副本。如果出于任何原因必须复制出映射的页面,那么您也可以让read操作为您复制它们。但是,如果可以就地对数据进行操作,则内存映射可能是成功的。

它通常并不像人们倾向于认为的那样有太大的区别。特别是当您考虑与所有这些东西相比磁盘有多慢时。

最新更新