解决大型系统需要太多内存?

时间:2014-11-03 07:58:03

标签: matlab out-of-memory linear-algebra sparse-matrix pagerank

假设我有一个稀疏矩阵M,它具有以下属性:

size(M) -> 100000 100000
sprank(M) -> 99236
nnz(M) -> 499987
numel(M) -> 1.0000e+10

为什么解决系统需要超过8GB的RAM? whos('M')仅提供8.4mb。

我正在使用以下代码(在http://www.mathworks.com/moler/exm/chapters/pagerank.pdf提供)

function x = pagerank(G,p)

G = G - diag(diag(G));

[n,n] = size(G);
c = full(sum(G,1));
r = full(sum(G,2)); 

% Scale column sums to be 1 (or 0 where there are no out links).

k = find(c~=0);
D = sparse(k,k,1./c(k),n,n);

% Solve (I - p*G*D)*x = e

e = ones(n,1);
I = speye(n,n);
x = (I - p*G*D)\e;

% Normalize so that sum(x) == 1.

x = x/sum(x);`

1 个答案:

答案 0 :(得分:4)

左派!那x = (I - p*G*D)\e确实会让事情看起来更多!

来自Matlab mldivide的稀疏矩阵:

enter image description here

并非所有解算器都占用相同数量的内存,其中一些解决方案占用了大量内存。在Matlab中左对分很棒,但你需要知道你在做什么。

如果你的内存不足,我建议看看一些迭代求解器,例如Preconditioned Conjugate Gradient(PGC)或代数多重网格(AMG),或者在复数的情况下,我认为Biconjugate gradients stabilized方法工作正常

如果你不知道从哪里开始,我强烈推荐PGC。在项目中,我正在处理我的左分割代码,如:

% CAUTION! PSEUDOCODE! do not try to run
try
   x=A\b
catch
   x=pgc(A,b) 
end