在 Eigen 库中是否有可能逐行为行主稀疏矩阵保留空间(每行不同)?
我正在尝试优化填充一个相当大的稀疏矩阵的内存消耗(~70mio x 70mio ~20 亿 nnz 是我可以达到的最大,但我想更进一步)。为了清楚我去的方式:
首先,我使用了推荐的 setFromTriplets,这可能是填充矩阵的最快方法,但在检查内存消耗时,我发现在我使用此函数时的峰值约为平均内存的两倍,这是有道理的,因为我 -在某个时候 - 将元素存储在矩阵和三元组 vector 中,直到 vector 超出范围。
使用 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
.
关于c++ - Eigen :行主要稀疏矩阵的不同行内存预留,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43593352/