具有特征大稀疏矩阵的OOM?

时间:2017-12-15 01:24:08

标签: eigen eigen3

我用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;
}

2 个答案:

答案 0 :(得分:0)

查看稀疏矩阵stored如何理解在你的情况下它需要分配一个5000000000 long int的数组。在您的情况下,只需使用RowMajor布局:

int main(void)
{
    //assign random values for testing
    int wallinfo[480];
    for(int i = 0; i < 480; i++)
        wallinfo[i] = !!(rand() % 2);

    //copy to the values to compress
    unsigned char compress[60] = { 0 };
    for(int i = 0; i < 60; i++)
        for(int j = 0; j < 8; j++)
            if(wallinfo[i * 8 + j])
                compress[i] |= 1UL << j;

    //decompress to get back wallinfo
    int decompress[480];
    for(int i = 0; i < 60; i++)
        for(int j = 0; j < 8; j++)
            decompress[i * 8 + j] = !!(compress[i] & (1UL << j));

    //wallinfo should match decompress
    if(memcmp(wallinfo, decompress, 480) == 0)
        printf("success\n");
    else
        printf("failed\n");

    return 0;
}

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

答案 1 :(得分:0)

您的矩阵有10行和5000000000列。但是,最大值可以存储为&#34; long int&#34; (在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 ++中通过Debugger运行它):

Eigen :: SparseMatrix A(10,5000000000); Eigen :: SparseMatrix A(10,5000000000);

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

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