【问题标题】:OOM with Eigen Large Sparse Matrix?OOM 与 Eigen 大稀疏矩阵?
【发布时间】:2017-12-15 01:24:07
【问题描述】:

我用 eigen 测试 SparseMatrix,似乎当我新建一个仅包含几个非零元素的 10*50 亿 SparseMatrix 时,它需要 50gb 内存!

演示代码:

#include <Eigen/Core>
#include <Eigen/SparseCore>
#include <iostream>
using namespace std;

int main()
{
    typedef Eigen::SparseMatrix<double, 0, long int> SMatrixXd;
    cout << "tag1"<< endl;
    SMatrixXd sfeature(10, 5000000000);
    cout << "tag1 done" << endl;

    // load data
    typedef Eigen::Triplet<double, long int> T;
    std::vector<T> tripletList;
    tripletList.push_back(T(0, 1, 1.0));
    tripletList.push_back(T(0, 2, 2.0));
    tripletList.push_back(T(1, 3, 2.0));
    tripletList.push_back(T(2, 4, 2.0));
    tripletList.push_back(T(3, 5, 2.0));
    tripletList.push_back(T(4, 6, 2.0));
    tripletList.push_back(T(5, 7, 2.0));
    cout << "tag2 " << endl;
    sfeature.setFromTriplets(tripletList.begin(), tripletList.end());
    cout << "tag2 done" << endl;
    return 0;
}

【问题讨论】:

    标签: eigen eigen3


    【解决方案1】:

    看看stored 的稀疏矩阵有多稀疏,以了解在您的情况下它需要分配一个 5000000000 long int 的数组。在您的情况下,只需使用 RowMajor 布局:

    typedef Eigen::SparseMatrix<double, RowMajor, long int> SMatrixXd;
    

    而之前的巨大数组将归结为一个 10 long int 的数组。

    【讨论】:

    • 谢谢你的回复,我改成RowMajor了,setFromTriplets还是要占用50gb内存。我如何有效地获得一个带有几个非零的巨大稀疏矩阵。我将setFromTriplets 更改为“插入”,但它似乎很慢。
    【解决方案2】:

    您的矩阵有 10 行和 5000000000 列。但是,可以存储为“long int”(在 typedef Eigen::SparseMatrix SmatrixXd 中指定)的最大值为 2,147,483,647。结果,5000000000(列数)的值被截断。 我猜它被截断到哪个值取决于您的计算机(在我的计算机上它被截断为 705032704)。 这是执行 SMatrixXd sfeature(10, 5000000000) 时 EIGEN 获得的列数。

    可以在此处找到 Microsoft 编译器(我使用 Visual C++)的值范围:https://msdn.microsoft.com/en-us/library/s3f49ktz.aspx

    你的编译器应该警告你截断问题。

    我尝试使用 __int64 或 long long 运行您的示例,但列值值仍被截断为 705032704(我通过 Visual C++ 中的调试器运行它):

    特征::稀疏矩阵 A(10, 5000000000); Eigen::SparseMatrix A(10, 5000000000);

    这不是编译器的问题,因为如果我设置 __int64 ival64 = 5000000000; 长长 ival_ll = 5000000000; 值很好。

    因此,我怀疑您的矩阵是否可以使用 EIGEN 进行处理。

    【讨论】:

    • 感谢您的回复,现在可以了。只需使用 reserver 来定义每行中的最大非零数,然后使用 insert 来初始化矩阵。但是当矩阵乘以稀疏向量时,它仍然是一个OOM问题。
    猜你喜欢
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    相关资源
    最近更新 更多