我正在制作一个程序,需要一次将最多几百张图像加载到内存中。每个文件占用100mb,所以我真的不想将所有文件存储在内存中。我想内存映射文件,以便操作系统在必要时将它们交换出来以节省物理内存。这是我想知道的。如果我已经在malloced内存中的文件中有我想要的数据,我应该打开文件描述符,使用write()将数据写入文件,然后映射文件。或者我可以在内存中映射新文件,然后使用memcpy复制数据。如果我要创建一个新文件,当我调用mmap给它一个大于文件大小的长度时它会增加磁盘上文件的大小吗?
答案 0 :(得分:0)
从POSIX标准:“mmap()函数可用于映射大于对象当前大小的内存区域。映射中的内存访问但超出底层对象的当前末尾可能导致SIGBUS信号被发送到进程。“(http://pubs.opengroup.org/onlinepubs/9699919799/)
也就是说,如果您是从页面对齐的mmap()
而不是{{1}获得的,那么您可以在MAP_FIXED
上使用aligned_alloc()
在您刚写入的相同内存区域上尝试malloc()
},或免费,然后mmap()
。但是请注意,操作系统会将您暂时没有使用过的内存分页,但您可以使用posix_madvise()
来帮助它。