我使用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,因此我只能使用一个核心:
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希望将它们作为临时变量,尽管存在极大的稀疏性,但内存使用仍会失控。
关于内存使用和上述内容的任何规则?或者如何更改我的parfor使用,以便在第二种情况下进行评分? “parfor”是一种新的东西,所以网上关于它的内容比其他核心功能要少......比运行8份matlab更有效!
答案 0 :(得分:0)
为了预测临时内存使用,我们必须更多地了解Matlab内部工作 - 我不知道。
对于你的第二个解决方案,你可以使用parfor
,如果你在内循环中这样做,我想(我至少没有得到m-lint警告)。如果有必要,可以转移你的问题,使M> N,因为你通常希望parfor
进行大量的快速计算,而不是很少的长计算,这样如果操作次数不足,你就会减少一些悬念。可以被8整除(或者你可以运行多少核心)。
cell_array_giant = cell(M,N)
for k = 1:N %# cannot use parfor with {i,k} dual indices!
parfor i = 1:M %# but you can use it here!
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
另外,是否可以在k-loop内构建巨大的稀疏矩阵?这完全避免了重塑。当然,你只能parfor
M-loop,否则,巨型阵列将被传递给所有工人,并且会产生很多悲伤。