我使用本徵爲大,稀疏矩陣(在此實例中)的尺寸2E8 X 1E6,其具有在每行至多128個元件。根據docs,在插入非零元素之前,我呼叫reserve
分配內存。對於大型矩陣,reserve
會拋出std::bad_alloc
異常。分配例外在本徵::稀疏矩陣::儲備
#include <iostream>
#include <Eigen/Core>
#include <Eigen/Sparse>
int main()
{
typedef Eigen::SparseMatrix<float, Eigen::RowMajor, long long int> SparseMat;
size_t n = 1000000, r = 200;
SparseMat T (r*n, n);
std::cerr << "Reserving memory" << std::endl;
size_t q = 128;
T.reserve(Eigen::VectorXi::Constant(r*n, q));
std::cerr << "Ready to start inserting elements..." << std::endl;
}
與clang++
或g++
在Ubuntu 16.04編譯在運行時將引發std::bad_alloc
異常:
$ clang++ -march=native -O3 -isystem eigen-3.3.3 test_sparse.cpp -o test_sparse && ./test_sparse
Reserving memory
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
[1] 26431 abort ./test_sparse
減少每行的非零元素q = 49
的數目或以下運行良好。設置q = 50
或更高版本會產生錯誤。類似的測試適用於矩陣大小。
還請注意,我明確地使用64位整數類型爲StorageIndex
。我的理解是64位應該足夠用來索引這個矩陣中的1.28e8非零元素,因爲它小於2^63-1 = 9.2e18。在極限情況下,它應該足以索引這種大小的密集矩陣(2e8 x 1e6 = 2e14 < 9.2e18)。
因此,我的問題是:
我是正確的假設,64位
StorageIndex
是這些矩陣尺寸足夠 ?如果是這樣,這是一個bug或者是錯誤的東西在我的例子嗎?
如果沒有,我也試過
__int128_t
,但產生以下 編譯器錯誤:EIGEN_STATIC_ASSERT(NumTraits<StorageIndex>::IsSigned,THE_INDEX_TYPE_MUST_BE_A_SIGNED_TYPE);
如何添加相關的特質?最後,可這個問題被規避,例如使用從三胞胎的初始化?
我不熟悉的本徵,但如何數據的字節數,你想保留和你有足夠的內存? –
好點,我的64GB不足以支持每行128個元素。 – ChD