繁体   English   中英

特征值:行主要稀疏矩阵的不同行式存储器保留

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

Eigen库中是否有可能为逐行(每个行都不同)的行稀疏矩阵预留空间?

我正在尝试优化填充相当大的稀疏矩阵的内存消耗(〜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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM