如何将内存中已有的地图数据存储到文件

时间:2015-10-05 02:40:00

标签: c linux memory-management

我正在制作一个程序,需要一次将最多几百张图像加载到内存中。每个文件占用100mb,所以我真的不想将所有文件存储在内存中。我想内存映射文件,以便操作系统在必要时将它们交换出来以节省物理内存。这是我想知道的。如果我已经在malloced内存中的文件中有我想要的数据,我应该打开文件描述符,使用write()将数据写入文件,然后映射文件。或者我可以在内存中映射新文件,然后使用memcpy复制数据。如果我要创建一个新文件,当我调用mmap给它一个大于文件大小的长度时它会增加磁盘上文件的大小吗?

1 个答案:

答案 0 :(得分:0)

从POSIX标准:“mmap()函数可用于映射大于对象当前大小的内存区域。映射中的内存访问但超出底层对象的当前末尾可能导致SIGBUS信号被发送到进程。“(http://pubs.opengroup.org/onlinepubs/9699919799/

也就是说,如果您是从页面对齐的mmap()而不是{{1}获得的,那么您可以在MAP_FIXED上使用aligned_alloc()在您刚写入的相同内存区域上尝试malloc() },或免费,然后mmap()。但是请注意,操作系统会将您暂时没有使用过的内存分页,但您可以使用posix_madvise()来帮助它。