[英]How to write python unittest for function that returns huge sparse matrix
[英]Huge sparse matrix in python
我需要在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)
刚开始时,它运行良好。 但是我的矩阵越来越大,计算机开始崩溃。 有没有更优雅的方式来存储矩阵?
基本上我有以下要求:
我的内存存储量超出了。 我正在阅读有关堆栈溢出和互联网其余部分的几篇文章;)我发现了PyTables,它不是真正用于矩阵计算的……等等。还有更好的方法吗?
您可能已经达到了Python可以为您做的极限,或者您可以做更多的事情。 尝试将数据类型设置为np.float32
,如果您使用的是64位计算机,则降低的精度可能会减少内存消耗。 np.float16
可能会进一步帮助您提高内存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
用途。
对于您的情况,我建议使用数据类型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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.