0

我对使用 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 副本效率更高!

4

1 回答 1

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 循环内构造巨大的稀疏矩阵?这完全避免了重塑。当然,你只能使用parforM-loop,否则的话,巨大的数组会传递给所有的 worker,并且会带来很多悲伤。

于 2010-10-30T15:17:10.773 回答