我遇到了一个我似乎无法解决的mmap问题。这是设置:我用malloc将一个巨大的多维数组分配到内存中,我用我的值填充它,然后我想将它保存在一个文件中。该数组包含3200000000个字节。该机器是64位的,并且有足够的内存来执行此操作。
Linux 2.6.32-27-server #49-Ubuntu SMP Thu Dec 2 02:05:21 UTC 2010 x86_64 GNU/Linux
使用mmap创建文件很好,我得到了ptrFile指针。 当我将数组存入ptrFile指针时,程序会因为段错而崩溃。
经过几次调试后,我看到两个缓冲区重叠。数据数组从地址0x7FEC47FFF010开始,mmap返回的指针是0x7FEA2543E000。我试过memmove来解决这个问题,但结果是一样的。如果我将复制到文件的大小限制为1000字节,它就可以正常工作。
为什么两个分配的指针重叠?
非常感谢!
- J
答案 0 :(得分:2)
那些内存区域不重叠(只要您的mmap
块的大小与您说的大小相同)。 0x7FEC47FFF010
- 0x7FEA2543E000
= 9,172,684,816
,远远大于您提到的3,200,000,000
的大小。
答案 1 :(得分:2)
mmap()无法扩展文件。在复制数据之前,首先必须使用例如ftruncate将文件放大到适当的大小。虽然使用mmap只是将数据复制到文件是过度的,但只需使用write(2)即可。
答案 2 :(得分:1)
你真的需要mmap
吗?如果你想做的唯一事情是保存你的记忆块,那么malloc区域的简单write
或fwrite
就足够了。您只需要确保它们处理64位大小。