0

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

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

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

4

2 回答 2

1

1000 万个双精度浮点数占用 80 MB 内存。如果将它们以CSR 或 CSC格式存储在 100 万 x 100 万稀疏矩阵中,则需要额外的 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数组。但在我看来,其中任何一个都将涉及您编写处理稀疏性的逻辑,除非不可能,否则我会尽量避免。

于 2013-01-25T15:40:11.563 回答
0

你应该使用scipy.sparse. 这是有关格式和用法的更多信息。

于 2013-01-25T12:23:51.617 回答