POSIX环境提供至少两种访问文件的方法.有标准的系统调用open(),read(),write(),和朋友,但也有使用的选项mmap(),将文件映射到虚拟内存.
何时优先使用一个而不是另一个?它们各自的优势是什么,包括两个接口?
我正在开发一个程序,该程序将处理可能大小为100GB或更大的文件.这些文件包含一组可变长度记录.我已经启动并运行了第一个实现,现在我正在寻求提高性能,特别是在输入文件被多次扫描时更有效地进行I/O.
mmap()通过C++的fstream库使用和读取块有经验吗?我想做的是从磁盘读取大块到缓冲区,从缓冲区处理完整记录,然后阅读更多.
该mmap()代码可能会变得非常凌乱,因为mmap"d块需要躺在页大小的边界(我的理解)和记录可能潜在般划过页面边界.使用fstreams,我可以寻找记录的开头并再次开始阅读,因为我们不仅限于阅读位于页面大小边界的块.
如何在不实际编写完整实现的情况下决定这两个选项?任何经验法则(例如,mmap()快2倍)或简单测试?
我对 70GB memmap 数组进行只读操作,但仅使用其中的约 300MB。从这个答案中得知,memmap 实际上并不使用物理内存,所以我认为我应该将所需的数组复制到物理内存中以获得更好的性能。
但是,当我 np.copy() 一个 memmap 和 np.info() 复制的数组时,该类是一个 memmap。不管这种猜测如何,当使用复制数组时,我看到更多的内存使用和性能的提高。
复制的内存映射是否使用物理内存?或者幕后还有其他事情发生?是不是看起来我正在使用物理内存来复制数组,而我的计算机一如既往地欺骗我?