我的程序使用需要存储在连续内存(几千兆字节)中的大数据集。使用std::allocator (即malloc或new)分配内存会导致系统停顿,因为大部分虚拟内存被保留,物理内存被填满。
由于程序一次只能处理小部分,所以我的问题是,使用内存映射文件是否具有优势(即mmap或与Windows相当的文件)。这是创建一个大型稀疏临时文件并将其映射到虚拟内存。或者,是否有另一种技术可以改变系统的分页策略,使一次加载到物理内存中的页面更少。
我试图避免构建一种流机制,该机制一次加载文件的各个部分,而是依赖于系统的vm分页。
发布于 2014-12-01 17:46:58
是的,mmap有可能加快速度。
需要考虑的事项:
malloc和free无论如何都会在MAP_ANON中使用mmap。因此,内存映射文件的区别很简单,就是让VMM为您做I/O。madvise和mmap来很好地帮助VMM分页。open和read (如erenon建议的,posix_fadvise)时,您的文件仍然保存在缓冲区中(也就是说,它不会立即写入),除非您也使用了O_DIRECT。因此,在这两种情况下,您都依赖内核进行I/O调度。发布于 2014-12-01 17:22:42
如果数据已经在文件中,它将加快速度,特别是在非顺序情况下。(在顺序情况下,read获胜)
如果使用open和read,也可以考虑使用福格鲁。
发布于 2014-12-01 18:26:39
这实际上取决于您的mmap()实现。将文件映射到内存有几个优点,可以被内核利用:
mmap()页面的内容已经存在于磁盘上。如果它决定删除这些页面,它可以省略回写。read()操作通常首先将数据读入内核内存,然后复制到用户空间。当然,您还可以避免在应用程序中缓冲未知大小的数据而引起的许多麻烦。但作为程序员,这只是一种方便。
然而,即使内核可以利用这些属性,它也不一定这样做。我的经验是,LINUX mmap()一般都很好;但是,在AIX上,我看到了非常糟糕的mmap()性能。所以,如果你的目标是表现,那是老的衡量标准--比较--决定待命。
https://stackoverflow.com/questions/27233564
复制相似问题