有效存储大型稀疏矩阵(浮点数)

时间:2013-01-25 11:56:01

标签: python matrix numpy sparse-matrix pytables

我正在寻找一种解决方案来存储稀疏矩阵的大约1000万个浮点(双精度)数。矩阵实际上是一个由100万乘以100万个元素组成的二维三角矩阵。元素(i,j)是元素score(i,j)和元素i之间的实际分数度量j。存储方法必须允许通过存储器映射包含矩阵的文件来非常快速地访问该信息。我当然不想在内存中加载所有文件。

class Score(IsDescription):
    grid_i = UInt32Col()
    grid_j = UInt32Col()
    score  = FloatCol()

我已经通过使用pytables类来尝试Score,但是如果不扫描所有行,我就无法直接访问元素i,j。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

1000万双精度浮点数占用80 MB内存。如果将它们存储在100万x 100万稀疏矩阵中,采用CSR or CSC格式,则需要额外的1100万个int32,总共大约125 MB。这可能不到系统中物理内存的7%。根据我的经验,在运行32位版本python的4GB系统上,在尝试保持十倍的数据之前,很少会开始分配数组。

在您的计算机上运行以下代码:

for j in itertools.count(100) :
    try :
        a = np.empty((j * 10**6,), dtype='uint8`)
        print 'Allocated {0} MB of memory!'.format(j)
        del a
    except MemoryError:
        print 'Failed to allocate {0} MB of memory!'.format(j)
        break

除非它没有达到上述计算量的至少4倍,否则不要犹豫是否使用scipy.sparse格式将整个内容粘贴在内存中。

我没有使用pytables的经验,也没有使用numpy的memmap数组。但在我看来,其中任何一个都会让你编写逻辑来处理稀疏性,除非不可能,否则我会尽量避免。

答案 1 :(得分:0)

您应该使用scipy.sparseHere's了解有关格式和用法的更多信息。