Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.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
错误的Alloc,具有200GB的可用内存c++; 我是C++新手,我在学习压缩感知,所以我需要用巨大的矩阵,而MATLAB实际上是慢的,所以我用C++编程了我的算法。p>_C++_Dynamic Arrays_Bad Alloc_Mingw W64 - Fatal编程技术网

错误的Alloc,具有200GB的可用内存c++; 我是C++新手,我在学习压缩感知,所以我需要用巨大的矩阵,而MATLAB实际上是慢的,所以我用C++编程了我的算法。p>

错误的Alloc,具有200GB的可用内存c++; 我是C++新手,我在学习压缩感知,所以我需要用巨大的矩阵,而MATLAB实际上是慢的,所以我用C++编程了我的算法。p>,c++,dynamic-arrays,bad-alloc,mingw-w64,C++,Dynamic Arrays,Bad Alloc,Mingw W64,问题是我存储的是大阵列(大约100Mb-1Gb)。它们大约有20个阵列,可以使用30 Gb的内存,但是当进程需要超过40 Gb时,它就会停止。我认为这是内存问题,我在Linux和Windows(OS 64位-编译器64位MinGW-200Gb Ram-intel Xeon)上测试了它,有任何限制吗 size_t tm=n*m*l; double *x=new double[tm]; 我使用了大约20个像这样的阵列。n、 m~=1000和L~=30是典型尺寸 谢谢您20个阵列,总共使用了40 G

问题是我存储的是大阵列(大约100Mb-1Gb)。它们大约有20个阵列,可以使用30 Gb的内存,但是当进程需要超过40 Gb时,它就会停止。我认为这是内存问题,我在Linux和Windows(OS 64位-编译器64位MinGW-200Gb Ram-intel Xeon)上测试了它,有任何限制吗

size_t tm=n*m*l;
double *x=new double[tm];
我使用了大约20个像这样的阵列。n、 m~=1000和L~=30是典型尺寸


谢谢您

20个阵列,总共使用了40 GB内存,这表明当阵列超过2 GB时程序会中断。这种情况不应该发生,64位地址空间应该使用64位
size\t
来表示对象大小。MinGW似乎错误地使用了31位大小(即丢失了符号位)


我不知道如何分配内存,但这也许可以通过绕过中断的分配例程直接转到操作系统分配器来解决。例如,对于Windows,您可以调用VirtualAlloc(跳过HeapAlloc,它不是为如此大的分配而设计的)

您可能有200 GB的总内存,但您要求的是40 GB的连续内存?你不能那样做我一点也不奇怪。将分配分为多个部分。“当进程需要超过40Gb时,它会停止”-因此您会得到一个
std::bad\u alloc
异常?您可以尽早尝试进行最大的分配—这可能会减少碎片。您的内存使用度量是基于源代码中的请求,还是像top或taskmanager这样的实用程序中所看到的那样?因为查看实用程序可能会深入了解是否存在内存泄漏…@GregHewgill:但它只是连续的虚拟内存。当然,操作系统将打破物理内存的映射,不管它认为合适吗?在一个16 EB大的地址空间中,你怎么没有40 GB的连续内存?!如果有40亿GB,则需要至少1亿个分散的块来对其进行分段。即使假设有40GB的连续地址空间,这在64位机器上也不应该是问题,如果需要40GiB,并且机器有200GiB,则物理RAM也不应该是问题。当然,碎片和物理内存都不能合理地解释这一失败的原因。