我有一组图像处理工具,最终可能会消耗大量内存,因为它用于处理大量图像(~50k x 50k x 1000 -> 2.5 terapixel)。虽然我确实尽可能地将东西保存在磁盘上并尽可能处理单个切片(低至 2.5 千兆像素),但有时它只是不起作用。
我想做的是拥有一块可以写入的内存,如有必要,将写入磁盘。这是交换空间背后的基本理念,但不需要 root/admin 访问权限和重新启动设置。这个交换空间将特定于我的进程和我指定的内存。
一种方法是使用内存映射文件。然而,我相信这有一些缺点。内存映射文件可能会起作用,也许我只需要纠正这些误解。请告诉我内存映射的实际工作原理(最好在 Windows 和 Linux 上)。
内存映射文件是否会尝试同步到磁盘?我希望它们从不同步,除非出于 RAM 目的需要(鉴于我从不调用 msync / FlushViewOfFile)。
如果我首先只将页面大小的数据块写入内存映射区域,那么底层文件是否被读取过?在 Linux 上:底层文件可以是使用 ftruncate-ing 创建的稀疏文件到所需大小吗?
在 Linux 上:有没有办法获得私有的非写时复制内存映射?
更改内存保护 (mprotect / VirtualProtect) 是否会导致数据同步?