我需要在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)
一开始这个工作正常。但我的矩阵越来越大,我的电脑开始崩溃。存储矩阵有更优雅的方式吗?
基本上我有以下要求:
我的ram存储空间超过了。我正在阅读有关堆栈溢出和互联网其余部分的几个帖子;)我发现了PyTables,它不是真正用于矩阵计算......等等。有更好的方法吗?
答案 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)