Matlab と cell2mat() 関数を使用すると、メモリに関して奇妙な動作が発生します...
私がやりたいことは次のとおりです。
cell_array_outer = cell(1,N)
parfor k = 1:N
cell_array_inner = cell(1,M);
for i = 1:M
A = do_some_math_and_return_a_sparse_matrix( );
cell_array_inner{i} = sparse(A); % do sparse() again just to be paranoid
end
cell_array_outer{k} = sparse( cell2mat( cell_array_inner ) );
end
Giant_Matrix = cell2mat( cell_array_outer ); % DOH!
しかし、残念なことに、「DOH」で示される行は、疎行列のサイズを合計した場合に必要以上に、途方もない量のメモリを使用します...大きすぎる中間構造を作成するように。
以下は問題なく動作しますが、二重インデックスは par-for では機能しないため、1 つのコアしか使用できません。
cell_array_giant = cell(M,N)
for k = 1:N % cannot use parfor with {i,k} dual indices!
for i = 1:M
A = do_some_math_and_return_a_sparse_matrix( );
cell_array_giant{i,k} = sparse(A); % do sparse() again just to be paranoid
end
end
cell_array_giant = reshape( cell_array_giant, 1, M * N )
Giant_Matrix = sparse( cell2mat( cell_array_giant ) ); % Ok... but no parfor
私の疑いでは、後者の場合、各セル要素のサイズははるかに扱いやすい... 20,000x1 疎行列のようですが、前者では、これらの「外側」要素は 20,000 x 5,000 になり、Matlab が望む場所に何らかの形で適合しません。それらを一時変数として配置すると、極度に希薄であるにもかかわらず、メモリ使用量が制御不能になります。
メモリの使用と上記に関して従うべき規則はありますか? または、2番目のケースでジャイブするようにparforの使用を変更する方法は? 「parfor」はちょっと新しいので、他のコア機能よりもウェブ上にそれについての情報が少ない... matlab の 8 つのコピーを実行するよりもはるかに効率的です!