gpt4 book ai didi

c - 使用C中的内存映射读取二进制文件

转载 作者:行者123 更新时间:2023-11-30 14:25:36 27 4
gpt4 key购买 nike

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

谢谢!!

最佳答案

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

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

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

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

它通常不会像人们想象的那样产生那么大的影响。尤其是当您考虑磁盘与所有这些东西相比有多慢时。

关于c - 使用C中的内存映射读取二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10159408/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com