gpt4 book ai didi

c - 高效读取映射数据内存

转载 作者:行者123 更新时间:2023-11-30 15:00:44 25 4
gpt4 key购买 nike

我想将一个大文件mmap到内存中并按顺序解析它。据我了解,如果字节被延迟读入内存一次,它们就会留在那里。有没有办法定期告诉系统释放以前读取的内容?

最佳答案

这种认识只是一种非常肤浅的看法。要了解真正发生的情况,您必须考虑进程的虚拟内存和机器的实际内存之间的差异。映射一个大文件意味着在虚拟地址空间中保留空间。如果此时已经读取了任何内容,则可能与平台相关。当您实际访问数据时,操作系统必须填充实际的内存页。当您访问其他部分时,这些部分必须被带入内存。何时重新使用内存完全取决于操作系统。通常,当您或其他进程访问某些数据并且没有可用内存时,就会发生这种情况。但随时可能发生。如果您稍后再次访问它,它可能仍在内存中或由操作系统带回。您的流程无法区分差异。

简而言之:你不需要关心这个。操作系统在后台管理所有这些。

有一点可能是,如果您映射一个非常大的文件,这会占用有限的虚拟地址空间中的空间。因此,如果您处理许多巨大的映射和/或巨大的分配,您可能只想在给定时间映射文件的部分内容。

补充:经过一番思考,我想到了为什么按 block 顺序进行可能更明智的原因。尽管我怀疑你是否能够衡量这一点。任何合理的操作系统都会在需要时按照如下顺序寻找要卸载的 block :

  1. 未映射的文件(不再需要)
  2. LRU 未修改的映射文件(可以从光盘中检索)
  3. LRU 修改映射文件(与 2 相同,但卸载前需要在光盘上更新)
  4. LRU分配的内存(需要写入交换区)

因此,取消映射已知永远不会再次使用的 block ,可以给操作系统一个提示,表明这些 block 应该尽早释放。这将为最近使用较少但将来可能访问的数据提供更大的机会保留在内存中。

关于c - 高效读取映射数据内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41876200/

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