Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ mmap如何分配超过20Gb的容量?_C++_C_Memory Management_Mmap_Virtual Memory - Fatal编程技术网

C++ mmap如何分配超过20Gb的容量?

C++ mmap如何分配超过20Gb的容量?,c++,c,memory-management,mmap,virtual-memory,C++,C,Memory Management,Mmap,Virtual Memory,我尝试使用mmap函数在虚拟空间中分配大量内存。我需要30Gb左右,但不行。我尝试使用20Gb,结果相同。我在带有60Gb RAM的OVH 64位机器服务器上执行了测试 我的测试代码: #include <stdio.h> #include <string.h> #include <sys/mman.h> #include <errno.h> int main() { void *r = NULL; printf("%lu\n",

我尝试使用mmap函数在虚拟空间中分配大量内存。我需要30Gb左右,但不行。我尝试使用20Gb,结果相同。我在带有60Gb RAM的OVH 64位机器服务器上执行了测试

我的测试代码:

#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
#include <errno.h>

int main()
{
   void *r = NULL;

   printf("%lu\n", sizeof(size_t));

   r = mmap(NULL, ((size_t)20)*1024*1024*1024, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);

   printf("%d %s\n", r == MAP_FAILED, strerror(errno));

   return 0;
}
有人可以告诉我是否可以用mmap分配30Gb的虚拟内存,为什么?还有,如何以其他方式分配30Gb

求你了,别问我为什么要这么做,或者这是愚蠢的,或者是另一种哲学思想。
这是我的需要,如果可能的话,我只想找到一种方法。我在Linux Mint 17(大致为Ubuntu 14.04)x86_64上毫无错误地运行了你的程序。我的系统有8G内存,16G交换,页面缓存当前使用的大部分8G内存,进程当前使用的1-2GB内存

(顺便说一句,对于这样的问题,您确实需要详细指定您的平台。)

我可以用两种不同的方式重现您的错误消息

第一种方式:

$ ./mmap
8
0 Success
$ ulimit -v 65536
$ ./mmap
8
1 Cannot allocate memory
第二种方式(从新外壳):

那么,正如@vz0所问的,
ulimit-a
说了什么

您有多少交换,使用了多少内存,以及您的系统如何设置
vm.overmit\u内存


我要冒一点险,断言其中一个是你的罪魁祸首。

好吧,你为什么要这么做?我知道你让我们不要问你这个问题,但知道你在努力完成什么可以帮助我们帮助你。我猜你可能有一个错误。什么是错误?这是秘密吗?你能少分配点吗?它开始失败的点在哪里?@Paul-这需要调试的敏锐性:通过改变东西来实际调查问题。这似乎已经脱离了SO海报的主题:(如果您在Linux上,请使用
ulimit-a
$ ./mmap
8
0 Success
$ ulimit -v 65536
$ ./mmap
8
1 Cannot allocate memory
$ ./mmap
8
0 Success
$ sysctl vm.overcommit_memory
vm.overcommit_memory = 0
$ sudo sysctl vm.overcommit_memory=2
vm.overcommit_memory = 2
$ ./mmap
8
1 Cannot allocate memory