python中的巨大稀疏矩阵

时间:2014-10-07 03:18:48

标签: python memory numpy scipy sparse-matrix

我需要在numpy / scipy中迭代地构造一个巨大的稀疏矩阵。初始化在循环中完成:

from scipy.sparse import dok_matrix, csr_matrix

def foo(*args):
    dim_x = 256*256*1024
    dim_y = 128*128*512
    matrix = dok_matrix((dim_x, dim_y))    

    for i in range(dim_x):
        # compute stuff in order to get j
        matrix[i, j] = 1.
    return matrix.tocsr()

然后我需要将它转换为csr_matrix,因为进一步的计算如:

matrix = foo(...)
result = matrix.T.dot(x)

一开始这个工作正常。但我的矩阵越来越大,我的电脑开始崩溃。存储矩阵有更优雅的方式吗?

基本上我有以下要求:

  • 矩阵需要存储从0到1的浮点值。
  • 我需要计算矩阵的转置
  • 我需要使用x_dimensional向量计算点积
  • 矩阵尺寸可以是1 * 10 ^ 9 x 1 * 10 ^ 8

我的ram存储空间超过了。我正在阅读有关堆栈溢出和互联网其余部分的几个帖子;)我发现了PyTables,它不是真正用于矩阵计算......等等。有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

您可能已经达到了Python可以为您做的限制,或者您可以做更多的事情。尝试设置np.float32的数据类型,如果你在64位机器上,这种降低的精度可能会减少你的内存消耗。 np.float16可以进一步帮助你记忆,但你的计算可能会变慢(我已经看过处理可能需要10倍时间的例子):

    matrix = dok_matrix((dim_x, dim_y), dtype=np.float32)    

或者可能更慢,但内存消耗更少:

    matrix = dok_matrix((dim_x, dim_y), dtype=np.float16)    

另一种选择:购买更多系统内存。


最后,如果您可以避免使用dok_matrix创建矩阵,并且可以使用csr_matrix创建矩阵(我不知道您的计算是否可行),您可以节省dok_matrix使用的字典上的开销很小。

答案 1 :(得分:2)

对于您的情况,我建议使用每个元素只需要一个字节的数据类型np.int8(或np.uint8):

matrix = dok_matrix((dim_x, dim_y), dtype=np.int8)

直接构建csr_matrix还可以让您进一步了解最大矩阵:

from scipy.sparse import csr_matrix

def foo(*args):
    dim_x = 256*256*1024
    dim_y = 128*128*512
    row = []
    col = []

    for i in range(dim_x):
        # compute stuff in order to get j
        row.append(i)
        col.append(j)
    data = np.ones_like(row, dtype=np.int8)

    return csr_matrix((data, (row, col)), shape=(dim_x, dim_y), dtype=np.int8)