【发布时间】:2011-08-31 22:17:04
【问题描述】:
我有一堆大文件,每个文件100GB以上,数据总量1TB,都是只读文件(随机读取)。
我的程序在大约 8GB 主内存的计算机上对这些文件进行少量读取。
为了提高性能(没有 seek() 和缓冲区复制),我考虑使用内存映射,并且基本上对整个 1TB 数据进行内存映射。
虽然一开始听起来很疯狂,但作为主内存
从磁盘读取以响应我的 read() 的所有页面都将被操作系统视为“干净”,因为这些页面永远不会被覆盖。这意味着所有这些页面都可以直接进入操作系统可以使用的页面列表,而无需写回磁盘或交换(清洗它们)。这意味着操作系统实际上可以仅将 LRU 页面存储在物理内存中,并且当页面不在主内存中时将只运行 reads()。
这意味着没有交换,也没有增加 i/o,因为内存映射很大。
这是理论;我正在寻找的是任何在实际生产中尝试或使用过这种方法并能分享他的经验的人:这种策略有什么实际问题吗?
【问题讨论】:
-
只要确保(如果读取确实是均匀随机的)禁用操作系统预取机制...
标签: performance memory operating-system mapping