高效读取映射数据内存
Read mmapped data memory efficient
我想mmap
一个大文件到内存中并顺序解析。据我了解,如果字节被懒惰地读入内存一次,它们就会留在那里。有没有办法定时通知系统释放之前读过的内容?
这种认识只是很肤浅的认识。
要了解实际发生的情况,您必须考虑进程的虚拟内存与机器的实际实内存之间的差异。映射一个巨大的文件意味着在您的虚拟 address-space 中保留 space。如果此时已经阅读了任何内容,则可能是 platform-dependent。
当您实际访问数据时,OS 必须填充一个实际的内存页面。当您访问其他部分时,必须将这些部分带入内存。这完全取决于 OS 何时 re-use 内存。通常,当您或其他进程访问某些数据并且没有可用内存时,就会发生这种情况。但随时可能发生。如果您稍后再次访问它,它可能仍在内存中或将由 OS 取回。您的流程无法分辨差异。
简而言之:你不需要关心那个。 OS 在后台管理所有这些。
有一点可能是,如果您映射一个非常大的文件,它会在您的虚拟 address-space 中占用 space,这是有限的。因此,如果您处理许多巨大的映射和/或巨大的分配,您可能希望在给定时间只映射文件的一部分。
补充: 经过一番思考,我想出了一个这样做可能更明智的原因 blockwise-sequential。尽管我怀疑您是否能够衡量这一点。
任何合理的 OS 都会在需要时按照以下顺序寻找要卸载的块:
- 未映射的文件(不再需要)
- LRU 未修改映射文件(可从光盘中检索)
- LRU修改映射文件(同2.但卸载前需要更新到光盘)
- LRU分配内存(需要写入swap)
所以取消映射已知永远不会再使用的块,你给 OS 一个提示,这些块应该更早地释放。这将使最近较少使用但将来可能访问的数据有更大的机会保留在内存中。
我想mmap
一个大文件到内存中并顺序解析。据我了解,如果字节被懒惰地读入内存一次,它们就会留在那里。有没有办法定时通知系统释放之前读过的内容?
这种认识只是很肤浅的认识。 要了解实际发生的情况,您必须考虑进程的虚拟内存与机器的实际实内存之间的差异。映射一个巨大的文件意味着在您的虚拟 address-space 中保留 space。如果此时已经阅读了任何内容,则可能是 platform-dependent。 当您实际访问数据时,OS 必须填充一个实际的内存页面。当您访问其他部分时,必须将这些部分带入内存。这完全取决于 OS 何时 re-use 内存。通常,当您或其他进程访问某些数据并且没有可用内存时,就会发生这种情况。但随时可能发生。如果您稍后再次访问它,它可能仍在内存中或将由 OS 取回。您的流程无法分辨差异。
简而言之:你不需要关心那个。 OS 在后台管理所有这些。
有一点可能是,如果您映射一个非常大的文件,它会在您的虚拟 address-space 中占用 space,这是有限的。因此,如果您处理许多巨大的映射和/或巨大的分配,您可能希望在给定时间只映射文件的一部分。
补充: 经过一番思考,我想出了一个这样做可能更明智的原因 blockwise-sequential。尽管我怀疑您是否能够衡量这一点。 任何合理的 OS 都会在需要时按照以下顺序寻找要卸载的块:
- 未映射的文件(不再需要)
- LRU 未修改映射文件(可从光盘中检索)
- LRU修改映射文件(同2.但卸载前需要更新到光盘)
- LRU分配内存(需要写入swap)
所以取消映射已知永远不会再使用的块,你给 OS 一个提示,这些块应该更早地释放。这将使最近较少使用但将来可能访问的数据有更大的机会保留在内存中。