首页 文章

python中的巨大稀疏矩阵

提问于
浏览
2

我需要在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 回答

  • 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)
    
  • 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 使用的字典上节省一点开销 .

相关问题