【问题标题】:Solving a large system takes too much memory?解决大型系统占用太多内存?
【发布时间】:2014-11-03 07:58:03
【问题描述】:

假设我有一个稀疏矩阵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);`

【问题讨论】:

  • 我必须说我使用了 32Gb 的 RAM 内存,以便能够使用 mldivide() 而不会出现您大小的矩阵问题。

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


【解决方案1】:

左分! x = (I - p*G*D)\e 做的事情比它看起来的要多!

来自 Matlab mldivide 用于稀疏矩阵:

并非所有求解器都占用相同数量的内存,其中一些会占用很多内存。 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

【讨论】:

    猜你喜欢
    • 2013-01-25
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 2015-10-14
    • 2013-07-18
    • 2013-07-11
    • 2020-05-18
    • 1970-01-01
    相关资源
    最近更新 更多