高效读取mmapped数据内存

时间:2017-01-26 14:52:32

标签: c mmap

我希望mmap将一个大文件存入内存并按顺序解析它。据我所知,如果字节被懒惰地读入内存一次,它们就会保留在那里。有没有办法定期告诉系统释放以前读过的内容?

1 个答案:

答案 0 :(得分:1)

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

简而言之:你不需要关心这一点。操作系统管理后台的所有内容。

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

ADDITION:在考虑了一下之后,我想出了为什么按块顺序执行它可能更聪明的原因。虽然我怀疑你能够衡量这一点。 任何合理的操作系统都会在需要时按以下顺序查找要卸载的块:

  1. 未映射的文件(不再需要)
  2. LRU未修改的映射文件(可以从光盘中检索)
  3. LRU修改了映射文件(与2.相同,但需要在卸载前在光盘上更新)
  4. LRU分配的内存(需要写入交换)
  5. 因此,当你去的时候,你知道永远不会再使用的未映射块,你会给操作系统提示这些应该在之前被释放。这将提供最近使用较少的数据,但将来可能会有更大的机会留在内存中。