3

Armadillo を使用して、CSV ファイルから読み取った C++ で大きな行列を操作しています。

mat X;
X.load("myfile.csv",csv_ascii);
colvec x1 = X(span::all,0);
colvec x2 = X(span::all,1);
//etc.

したがって、x1、...、xk(k=20たとえば)はXの列です.Xには通常、2000から16000の範囲の行があります.私の質問は次のとおりです。

X をヒープ (フリー ストア) に割り当てる (そして後で解放する) にはどうすればよいですか?

Armadillo ドキュメントのこのセクションでは、マットの補助メモリの割り当てについて説明しています。これはヒープ割り当てと同じですか? X が csv から読み取られるまで、行列の次元に関する事前の知識が必要です。

mat(aux_mem*, n_rows, n_cols, copy_aux_mem = true, strict = true) 

どんな提案でも大歓迎です。(私は g++-4.2.1 を使用しています。現在のプログラムは Macbook Pro でローカルに問題なく動作しますが、大学のコンピューティング クラスター (Linux g++-4.1.2) で実行すると、セグメンテーション エラーが発生します。プログラムサイズが大きすぎて投稿できません)。

編集:私はこれをやった:

arma::u32 Z_rows = 10000;
arma::u32 Z_cols = 20;
double* aux_mem = new double[Z_rows*Z_cols];
mat Z(aux_mem,Z_rows,Z_cols,false,true);
Z = randn(Z_rows, Z_cols);

最初にヒープにメモリを割り当て、次に行列 Z にそれを使用するように指示します。

4

1 に答える 1

2

ソース コードを見ると、Armadillo は既に大きな行列をヒープに割り当てています。

必要なメモリ量を減らすには、matの代わりにfmatを使用することをお勧めします。これには、精度の低下というトレードオフが伴います。

fmatは float を使用し、matは double を使用します: http://arma.sourceforge.net/docs.html#Matを参照してください。

また、Linux コンピューティング クラスタのシステム管理者が制限を有効にしている可能性もあります (たとえば、各ユーザーは特定の最大メモリ量までしか割り当てることができません)。たとえば、http://www.linuxhowtos.org/Tips%20and%20Tricks/ulimit.htm を参照してください

于 2011-12-05T05:16:58.467 に答える