2

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

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

我假设我可以映射一个最大 5GB 的文件。我尝试了我在互联网上学到的所有东西,包括使用MAP_NORESERVEflag 和 set overcommit_memoryto 1。还是一样的Cannot allocate memory,什么可能出错?

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

4

2 回答 2

11

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

于 2012-05-12T05:48:39.793 回答
3

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

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

于 2012-05-12T06:09:42.043 回答