System.OutOfMemoryException的。创建一个大矩阵

时间:2013-07-16 14:49:02

标签: c# matrix out-of-memory

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

这是我的代码的一部分:

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);

这里的NumberOfObjects大约是15000。 当我为较少数量的对象进行计算时,一切都很好,但是对于我的所有数据,我得到了一个例外。 有可能解决这个问题吗?

我正在使用macOS,x64

我的环境是MonoDevelop

3 个答案:

答案 0 :(得分:4)

double[,] covarianceMatrix = new double[numberOfObjects,numberOfObjects];

你说你的矩阵是[3,15000]而且numberOfObjects是15000.通过这行代码,你创建了一个[15000,15000]双精度矩阵

15000 * 15000 = 225000000双倍,每个8字节:1,800,000,000字节或1.8GB

这可能是你内存不足的原因。

修改

根据this questionthis question,C#中对象的大小不能大于2GB。 1.8GB不计算引用阵列中的项目所需的任何额外开销,因此1.8GB可能实际上是>当所有内容都被计算在内时2GB(如果没有调试信息,那么拥有更多C#经验的人可能不得不让我直截了当)。如果您尝试使用非常大的数组,可以考虑这个workaround,因为静态分配的数组可能会变得混乱。

答案 1 :(得分:0)

创建协方差矩阵时,您创建的对象为15000 * 15000 = 225000000

所以你需要1800000000字节的内存。正是因为你有OutofMemoryException

答案 2 :(得分:0)

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