2017-01-26 36 views
0

我想mmap一个大文件进入内存,并顺序解析它。据我了解,如果字节一度被懒惰地读入内存,他们会留在那里。有没有办法定期告诉系统释放先前读取的内容?阅读mmapped数据内存高效

回答

1

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

总之:你不需要关心这一点。操作系统管理所有在后台。

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

ADDITION:在想了一下之后,我想出了一个理由,为什么它可能更智能地进行分段顺序。尽管我怀疑你能够衡量这一点。 任何合理OS将寻找一个块卸载时,需要在类似如下的命令:

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

所以取消映射块的已知在你不去的时候再次使用它,你会给操作系统一个提示,告诉它们应该尽早释放它们。这会给最近使用的数据,但可能在将来访问的数据留在内存中的机会更大。

+0

'总之你:你不需要关心那件事。操作系统在后台管理。“这更好。谢谢! –