本征:行主要稀疏矩阵的不同行内存预留

Eigen: different row-wise memory reservation for row major sparse matrix

在 Eigen 库中是否完全有可能为行主稀疏矩阵逐行保留 space(每行不同)?

我正在尝试优化填充相当大的稀疏矩阵的内存消耗(约 70mio x 70mio 约 20 亿 nnz 是我可以达到的最大但我想走得更远)。明确我的去向:

首先,我使用了推荐的 setFromTriplets,这可能是填充矩阵的最快方法,但在检查内存消耗时,我发现在使用此函数时的峰值约为平均内存的两倍,这是有道理的,因为我 - 在某些时候 - 将元素存储在矩阵和三元组向量中,直到向量超出范围。

使用insert() 可以明显改善最大内存消耗。尽管如此,由于重新分配,我仍然达到了顶峰。然后我还使用了 reserve() 以便没有(或更少)重新分配。它还将峰值降低了很多,但并没有完全消失,同样是由于一些重新分配(如果 valgrind 是正确的)。由于我的大部分行的 NNZ 都低于最大值,因此我在存储中获得了相当多的空分配条目,这增加了平均内存消耗。使用 makeCompressed 再次降低了平均值,但显然也使峰值再次升高,因为在调用它时必须进行更多的重新分配。

为什么我现在问上面的问题是: 我可以预先计算每一行的 NNZ 并对它们进行排序,这样我实际上应该能够完全优化这个有如果我可以为每一行保留不同数量的 NNZ,则没有任何空分配且没有重新分配峰值的压缩矩阵。

如果有人告诉我这在 Eigen 中是否可行,我将不胜感激:你知道任何支持它的库吗?

非常感谢!

是的,这是可能的,您也许可以在文档中找到该功能:

template<class SizesType> void SparseMatrix::reserve(const SizesType & reserveSizes);

请注意 SizesType 可以是 std::vector(或 std::deque)或 Eigen::VectorXi

此外,如果您能够按顺序将元素插入矩阵,您还可以查看(内部)函数 insertBack