我有足够的内存,但mmap一直说失败说无法分配内存

时间:2012-05-12 05:40:57

标签: c linux memory-management

我正在尝试mmap一些大文件但失败了:我无法mmap任何大于2.7 GB的文件。

通过ulimit -a,它说我的虚拟内存是无限的。然后我做了cat /proc/meminfo它说我的系统有3GB Memfree和2GB Swapfree。

我假设我可以mmap一个高达5GB的文件。我尝试了在互联网上学到的所有内容,包括使用MAP_NORESERVE标记并将overcommit_memory设置为1。它仍然是相同的,Cannot allocate memory。什么可能出错?

我使用64位cpu和32位linux系统。如果您需要更多信息,请告诉我。我真的很感激任何建议或提示。

2 个答案:

答案 0 :(得分:10)

您需要使用64位操作系统,因为32位操作系统没有足够的地址空间 编辑:虽然你的系统有一些物理内存可用,但32位进程只能达到4GB,内核驱动程序的内核保留大约1-2GB ......所以32位应用程序的用户空间通常有2GB。

答案 1 :(得分:2)

您的应用程序根本没有足够的地址空间(可用内存地址)来映射大文件。

在Linux下,在32位内核上运行的32位进程通常具有大约3GB的可用地址空间,而在64位内核上运行的32位进程具有4GB的可用地址空间。如果您需要更多,则需要将应用程序编译为64位进程。这将为您提供至少128TB的地址空间。