Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.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++ 32位应用的特征最大矩阵大小_C++_Matrix_Eigen - Fatal编程技术网

C++ 32位应用的特征最大矩阵大小

C++ 32位应用的特征最大矩阵大小,c++,matrix,eigen,C++,Matrix,Eigen,所以,当我试图声明一个大于10000x1000的矩阵时,我发现包崩溃了。我需要像这样声明一个矩阵。。大约13000x13000个元件。我进行了如下测试: for( int tortureEigen = 1 ; tortureEigen < 50000 ; tortureEigen++ ) { printf( "Torturing Eigen with %dx%d..\n", tortureEigen, tortureEigen ) ; Eigen::MatrixXd m( tort

所以,当我试图声明一个大于10000x1000的矩阵时,我发现包崩溃了。我需要像这样声明一个矩阵。。大约13000x13000个元件。我进行了如下测试:

for( int tortureEigen = 1 ; tortureEigen < 50000 ; tortureEigen++ )
{
  printf( "Torturing Eigen with %dx%d..\n", tortureEigen, tortureEigen ) ;
  Eigen::MatrixXd m( tortureEigen, tortureEigen ) ;
}
for(int-truseGen=1;truseGen<50000;truseGen++)
{
printf(“用%dx%d…折磨本征”,折磨本征,折磨本征);
特征::矩阵XXD m(折磨特征,折磨特征);
}
在我的计算机(6 GB RAM)上以14008个元素崩溃

我有点失望!我认为Eigen就像MATLAB或octave一样,不应该使用更大的数组崩溃,即使它确实击中了磁盘或其他东西

更重要的是,当我运行这个测试并保持TaskMan打开时,创建这些矩阵的过程甚至不会占用那么多内存。TaskMan报告2k使用情况

使用Eigen 2.0.15从Eigen文档中稳定释放:

密集与稀疏: 该矩阵类处理密集而非稀疏的矩阵和向量。有关稀疏矩阵和向量,请参见稀疏模块。
密集矩阵和向量是普通的系数数组。所有系数都存储在一个普通的连续数组中。这与稀疏矩阵和向量不同,稀疏矩阵和向量中的系数存储为非零系数列表。 让我们看看,10000x1000x8(双矩阵)的容量约为1.5GB。这大约是32位操作系统下continuos堆块的最大大小。试试稀疏矩阵


如果你真的需要这么大的密集矩阵,那么你还有很多其他问题:计算会在下一次断电前结束吗?

鉴于你的硬件规格,我只能假设你运行的是64位操作系统


即使内存被分页到页面文件中,您仍然可能崩溃。这可能意味着内存碎片化,或者页面文件仍然太小。如果是这样,您应该将页面文件放大到8或12GB左右。您最好在我们的支持渠道(如论坛…;-)上询问Eigen问题

简短回答:您使用的是固定大小矩阵还是动态大小矩阵

  • 如果是固定尺寸,则切换到动态尺寸(对于如此大的尺寸,这是一个无需思考的问题)

  • 如果你得到的是动态大小矩阵的错误,我很惊讶,但同时我可以看到10000的值来自哪里。在任何情况下,如果您升级到Egeng3(开发分支),您的问题将消失


    • 这里的所有答案都很有帮助

      事实证明,当编译为32位应用程序时,如果你像我一样试图声明一个大于14000个元素的应用程序,Eigen就会崩溃。崩溃发生时,本征alloc代码(MatrixXd::resize())返回0,这意味着在32位下无法分配1.5GB连续对齐RAM,这是有意义的,因为这接近最大可寻址内存loc的一半。我想,在4.0中找到超过1.5 GB的连续数据是不太可能的!不幸的是,升级到Egen 3.0并不能解决问题

      解决方案#1 好吧,那么我用64位编译,在我的6GB机器上,程序运行成功,密集矩阵分配和解决方案工作正常

      解决方案#2
      另一种解决方案是使用
      dynamicParsematrix
      。Sparse不会在大尺寸alloc上崩溃,即使是作为32位应用程序,但解决问题的API支持是另一回事(API似乎想转换为MatrixXd稠密类型以解决问题,这给我们留下了相同的原始问题。)

      在崩溃时,您是否收到任何错误消息?你能在调试器中捕获它吗?如果我们有更多的信息,我们可能会提供帮助。OTOH,我的直觉告诉我这是Eigen邮件列表的问题。崩溃发生时,
      \u aligned\u malloc
      在Eigen alloc代码(MatrixXd::resize())中返回0,我认为内存碎片不太可能出现。要将64位地址空间分割得如此糟糕,以至于没有一个连续的1.5 GB块是可用的,这并不容易。您可能是对的。但可能性要小得多。但更可能的是分页文件太小。我一定是疯了,但10000*10000*8字节=762.9 MB。然而,14000对应于1.5GBdat chu,你是对的。计算14000,写10000,哦,注册的神话!不幸的是,这对我不起作用-请参阅下面的回复:Windows 32位,4GB虚拟地址空间被分成两部分,一半用于内核,另一半用于用户模式应用程序(除非使用/3GB开关,这会给您额外的1G)。因此,1.5GB的容量已经接近2GB的极限。请记住,密集矩阵需要连续的内存块,其他模块和共享库加载的进程在进一步分割地址空间时对您不利。以下是一篇有趣的文章: