Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.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# System.OutOfMemoryException。创建一个大矩阵_C#_Matrix_Out Of Memory - Fatal编程技术网

C# System.OutOfMemoryException。创建一个大矩阵

C# System.OutOfMemoryException。创建一个大矩阵,c#,matrix,out-of-memory,C#,Matrix,Out Of Memory,我有一个矩阵[315000]。我需要计算原始矩阵的协方差矩阵,然后找到它的特征值 这是我代码的一部分: double[,] covarianceMatrix = new double[numberOfObjects,numberOfObjects]; for (int n=0; n<numberOfObjects;n++) { for (int m=0;m<numberOfObjects;m++) { double sum = 0;

我有一个矩阵[315000]。我需要计算原始矩阵的协方差矩阵,然后找到它的特征值

这是我代码的一部分:

double[,] covarianceMatrix = new double[numberOfObjects,numberOfObjects];
for (int n=0; n<numberOfObjects;n++)
    {
    for (int m=0;m<numberOfObjects;m++)
    {
        double sum = 0;
        for (int k=0; k<TimeAndRepeats[i,1]; k++)
        {
            sum += originalMatrix[k,n]*originalMatrix[k,m];
        }
    covarianceMatrix[n,m] = sum/TimeAndRepeats[i,1];
    }
}
alglib.smatrixevd(covarianceMatrix,numberOfObjects,1,true,out eigenValues, out eigenVectors);
double[,]协方差矩阵=新的double[numberOfObjects,numberOfObjects];

对于(int n=0;n当您创建协方差矩阵时,您正在创建15000*15000=22500000的对象

因此,您需要1800000000字节的内存。正因为如此,您才有OutofMemoryException

double[,] covarianceMatrix = new double[numberOfObjects,numberOfObjects];
你说你的矩阵是[3,15000],而
numberOfObjects
是15000。通过这行代码,你创建了一个双精度矩阵[15000,15000]

15000*15000=22500000每8字节加倍:1800000000字节或1.8GB

这可能就是内存不足的原因

编辑:


根据和,C#中对象的大小不能大于2GB。1.8GB不包括引用数组中项目所需的任何额外开销,因此在考虑所有因素时,1.8GB实际上可能大于2GB(不能说没有调试信息,有更多C#经验的人可能必须让我明白这一点)你可能会考虑这一点,如果你想用很大的数组,因为静态分配的数组可能会变得混乱。

< P>异常名称告诉你到底有什么问题。你可以使用浮点而不是双倍来平分内存所需的内存。其他选项是创建一些协方差矩阵的类对象。将数据存储在磁盘文件中,尽管您需要实现适当的机制来对其进行操作,而且性能也会受到限制。

这与monodevelop中的设置有关吗?1800000000它大约1.7 GB,这意味着您必须有1.7 GB的可用RAM可以分配给您的程序(好吧,我不想说得太详细,我只是简化了这里的想法),因此,我认为当您在功能更强大的计算机中时,您将能够毫无问题地进行此计算。我是否允许我的程序使用更多内存来避免此异常?x64是否支持每个进程寻址更多内存?或者它可能是Mac的东西……这不会在windows中启用x64。@Vivek x64允许更大的整数值和内存地址(因为您谈论的是64个1和0,而不是32个。它不会更改C处理的数据结构的最大大小#