我需要在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 回答
对于您的情况,我建议使用数据类型
np.int8
(或np.uint8
),每个元素只需要一个字节:直接构建
csr_matrix
还可以让您进一步了解最大矩阵大小:你可能已经达到了Python可以为你做的极限,或者你可以做更多的事情 . 尝试设置
np.float32
的数据类型,如果您使用的是64位计算机,这种降低的精度可能会降低您的内存消耗 .np.float16
可以进一步帮助你记忆,但你的计算可能会变慢(我已经看过处理可能需要10倍时间的例子):或者可能更慢,但内存消耗更少:
另一种选择:购买更多系统内存 .
最后,如果您可以避免使用
dok_matrix
创建矩阵,并且可以使用csr_matrix
创建它(我不知道这是否可以用于您的计算),您可以在dok_matrix
使用的字典上节省一点开销 .