私はすでにを知っているEigen :: SparseMatrixのスパースパターンを設定する必要があります(私は一意のソートされた列インデックスと行オフセットを持っています)。明らかにそれはsetFromTripletsを介して可能だが、残念ながらsetFromTripletsは(少なくとも私の場合)メモリオーバーヘッドなしでEigen :: SparseMatrixのスパースパターンを設定する
を追加大量のメモリを必要と私はラインの間(この例では、ピーク時26Gbについて何かを消費小さな例に私の場合は
const long nRows = 5000000;
const long nCols = 100000;
const long nCols2Skip = 1000;
//It's quite big!
const long nTriplets2Reserve = nRows * (nCols/nCols2Skip) * 1.1;
Eigen::SparseMatrix<double, Eigen::RowMajor, long> mat(nRows, nCols);
std::vector<Eigen::Triplet<double, long>> triplets;
triplets.reserve(nTriplets2Reserve);
for(long row = 0; row < nRows; ++row){
for(long col = 0; col < nCols; col += nCols2Skip){
triplets.push_back(Eigen::Triplet<double, long>(row, col, 1));
}
}
std::cout << "filling mat" << std::endl << std::flush;
mat.setFromTriplets(triplets.begin(), triplets.end());
std::cout << "Finished! nnz " << mat.nonZeros() << std::endl;
//Stupid way to check memory consumption
std::cin.get();
を書きました結局、 "マット"と "フィニッシュ")と18Gb。 (私はhtop
ですべての小切手を作った)。 〜8Gbのオーバヘッドはかなり大きいです(私の "現実世界"の仕事では私はより大きなオーバーヘッドを持っています)。
だから、私は2つの質問があります。setFromTripletsは非常に多くのメモリを必要とする理由
- を?
私の例が間違っている場合は教えてください。
私の固有のバージョンは、私の英語
EDITのため申し訳ありません3.3.2
PSです:各トリプレットを手動でより速く動作し、ピーク時より少ないメモリを必要とinserting(preallocation付き)みたいだ が見えます。しかし、私はまだそれがスパースパターンを設定することが可能であるかを知りたい手動