如何使用Scipy处理大型稀疏矩阵的构建?

3

我正在处理维基百科的转储文件,计算大约570万个页面的PageRank值。

这些文件已经预处理过了,因此不是XML格式。
它们来自于http://haselgrove.id.au/wikipedia.htm,格式如下:

from_page(1): to(12) to(13) to(14)..
from_page(2): to(21) to(22)..
.
.
.
from_page(5,700,000): to(xy) to(xz)

所以,基本上它是一个由[5,700,000*5,700,000]矩阵构建而成的结构,这会让我的4GB RAM崩溃。由于它非常稀疏,使用scipy.lil.sparsescipy.dok.sparse更容易存储,现在我的问题是:

我应该如何将带有链接信息的.txt文件转换为稀疏矩阵呢?读取并计算成普通的N*N矩阵再进行转换吗? 我无从下手。

此外,链接有时会跨越多行,那么正确的处理方式是什么呢?
例如:随机一行可能是这样的...

[
1: 2 3 5 64636 867
2:355 776 2342 676 232
3: 545 64646 234242 55455 141414 454545 43
4234 5545345 2423424545
4:454 6776
]

完全像这样:没有逗号和分隔符。

有关稀疏矩阵构建和跨行数据处理的任何信息都将很有帮助。

1个回答

1
Scipy提供了几种稀疏矩阵的实现,每种都有其优缺点。你可以在这里找到有关矩阵格式的信息here
有几种方法可以得到所需的稀疏矩阵。计算完整的NxN矩阵然后进行转换可能不可行,因为需要高内存要求(约10^12个条目!)。
在您的情况下,我建议您准备好数据来构造coo_matrix
coo_matrix((data, (i, j)), [shape=(M, N)])

data[:] the entries of the matrix, in any order
i[:] the row indices of the matrix entries
j[:] the column indices of the matrix entries

你可能还想看一下lil_matrix,它可以用于逐步构建矩阵。
创建矩阵后,您可以将其转换为更适合计算的格式,具体取决于您的用例。
我不认识这种数据格式,可能有解析器可用,也可能没有。不过编写自己的解析器应该不难。每行包含一个冒号开始一个新行,冒号后和连续行中没有冒号的所有索引都是该行的列条目。

有没有一种直接从稀疏行列表(每行都是(列,值)对的列表)构建lil_matrix的方法?这似乎是显而易见的方法,但似乎不受支持。 - nealmcb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接