2012-05-12 81 views
2

我想mmap一些大文件,但失败:我不能mmap任何文件大于2.7 GB左右。我有足够的内存,但mmap保持失败,说不能分配内存

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

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

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

回答

2

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

在Linux下,在32位内核上运行的32位进程通常具有大约3GB的可用地址空间,并且在64位内核上运行的32位进程具有4GB可用地址空间。如果您需要的不仅仅是这些,您需要将应用程序编译为64位进程。这会给你至少128TB的地址空间。

+0

I看到!我真的很感激你的快速反应! – tracy0325

10

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

+0

非常感谢!这解释了一切! – tracy0325

+1

如果内核和用户空间是32位,则用户空间可以使用3GB,但它会有点碎片化,最大的连续可用性可能是2.5GB或更少。此外,实现禁止(这将是智能的)单个分配大于2GB,因为它们会导致指针减法中的危险的有符号整数溢出。如果内核是64位,但用户空间是32位,那么完整的32位(4GB)地址空间应该可用于用户空间应用程序,但它也可能被分割或对连续分配有限制... –

相关问题