我的程序处理需要存储在连续内存(几千兆字节)中的大型数据集。使用 std::allocator
(即 malloc
或 new
)分配内存会导致系统停顿,因为大部分虚拟内存被保留并且物理内存被填满上。
由于该程序一次只能在一小部分上工作,我的问题是使用内存映射文件是否会提供优势(即 mmap
或 Windows 等效文件。)这就是创建一个大的稀疏临时文件并将其映射到虚拟内存。或者是否有另一种技术可以改变系统的分页策略,以便一次将更少的页面加载到物理内存中。
我试图避免构建一次加载文件的多个部分的流机制,而是依赖于系统的 vm 分页。
最佳答案
是的,mmap
具有加快速度的潜力。
需要考虑的事项:
- 请记住 VMM 会以阻塞的页面大小(在 Linux 上为 4k)将内容分页进出
- 如果您的内存访问随着时间的推移得到很好的本地化,那么这会很有效。但是,如果您对整个文件进行随机访问,您最终会(仍然)进行大量的搜索和颠簸。因此,请考虑您的“小部分”是否与文件的本地化部分相对应。
- 对于大型分配,
malloc
和free
无论如何都会使用mmap
和MAP_ANON
。因此,内存映射文件的不同之处在于,您让 VMM 为您执行 I/O。 - 考虑将
madvise
与mmap
结合使用,以协助 VMM 进行良好的分页。 - 当您使用
open
和read
(另外,正如erenon 所建议的那样,posix_fadvise
),您的文件仍然保存在缓冲区中(即它不会立即写出)除非你也使用O_DIRECT
。因此,在这两种情况下,您都依赖内核进行 I/O 调度。
关于c++ - 内存映射文件是否为大缓冲区提供了优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27233564/