【问题标题】:System.OutOfMemoryException. Creating a big matrixSystem.OutOfMemoryException。创建一个大矩阵
【发布时间】:2023-04-02 21:40:01
【问题描述】:

我有一个矩阵 [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

【问题讨论】:

    标签: c# matrix out-of-memory


    【解决方案1】:
    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,因为静态分配的数组可能会变得混乱。

    【讨论】:

    • 我可以让我的程序使用更多内存来避免这个异常吗?
    • x64 不支持为每个进程寻址更多内存吗?或者可能是 Mac 的问题......这不会在 Windows 中引发 x64。
    • @Vivek x64 允许更大的整数值和内存地址(因为您说的是 64 个 1 和 0,而不是 32 个。它不会更改 C# 处理的数据结构的最大大小跨度>
    【解决方案2】:

    当你创建 covarianceMatrix 时,你会创建一个 15000*15000 = 225000000 的对象

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

    【讨论】:

    • 与monodevelop中的设置有关吗?
    • 1800000000 大约 1.7 GB,这意味着您必须有 1.7 GB 的空闲 RAM 可以分配给您的程序(好吧,我没有详细说明,我在这里简化了思考),所以我认为当您使用更强大的机器时,您将能够毫无问题地进行此计算。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-22
      • 2018-04-16
      • 2021-11-16
      • 2021-04-07
      相关资源
      最近更新 更多