【问题标题】:memory efficient way to make large zeros matrix python使大零矩阵python的内存有效方法
【发布时间】:2017-09-02 04:50:21
【问题描述】:

我目前正在尝试制作一个非常大的矩阵,我不确定如何以内存有效的方式进行。

我尝试使用 numpy,它适用于我的小机箱 (2750086X300) 但是,我得到了一个更大的,2750086X1000,这对我来说太大了。

我虽然打算用整数来制作它,但我会向它添加浮点值,所以不确定 cld 会如何影响它。

我试图找到一些有关制作稀疏零填充数组的方法,但请不要在此处或其他地方找到任何很棒的主题/问题/建议。

有人有什么好的建议吗?我目前正在使用 python,所以我正在寻找一个 pythonic 解决方案,但我愿意尝试其他语言。

谢谢


编辑:

感谢您的建议,我尝试了 scipy.sparse.csr_matrix,它设法创建了一个矩阵,但大大增加了通过它的时间。

这是我正在做的事情:

matrix = scipy.sparse.csr_matrix((df.shape[0], 300))
## matrix = np.zeros((df.shape[0], 

for i, q in enumerate(df['column'].values):    

    matrix[i, :] = function(q)

其中函数几乎是该行上的向量运算函数。

现在,如果我在 np.zeros 上执行循环,它会很容易完成,大约 10 分钟。

现在,如果我尝试对 scipy 稀疏矩阵做同样的事情,大约需要 50 个小时。这不太合理。

有什么建议吗?


编辑 2:

scipy.sparse.lil_matrix 成功了

循环大约需要 20 分钟,并且使用的内存比 np.zeros 少

谢谢。


编辑 3:

内存还是很贵的。决定不在矩阵上存储数据。一次处理 1 行。从中获取相关值/指标,将值存储在原始 df 中,再次运行。

【问题讨论】:

  • np.zeros((2750086, 1000)) 可能对您的记忆来说太大了,无论是填充零还是实数。一个稀疏矩阵,比如说只有 0.1% 的非零可能适合。但是你在用这个数组做什么?逐个元素地填充它将永远存在。任何带有几乎填满内存的数组的数学运算都会在创建临时缓冲区时产生内存错误。
  • 想一想,使用32位数字至少需要2750086*1000*1e-9*4 =11.000344 gigabytes。不是完全疯狂,但相当大。您可以获得更多 RAM 或尝试使用稀疏表示。
  • [scipy] sparse 上搜索以查找有关[scipy] 中稀疏矩阵包的问题。 lilcoocsr 也可用作唯一字符串。如果您正在学习或测试像 scikit-learn 这样的处理包,可能会有用。

标签: python performance numpy memory scipy


【解决方案1】:

试试scipy.sparse.csr_matrix:

from scipy.sparse import *
from scipy import *
a=csr_matrix( (2750086,1000), dtype=int8 )

那么a就是

<2750086x1000 sparse matrix of type '<class 'numpy.int8'>'
    with 0 stored elements in Compressed Sparse Row format>

例如,如果你这样做:

from scipy.sparse import *
from scipy import *
a=csr_matrix( (5,4), dtype=int8 ).todense()
print(a)

你得到:

[[0 0 0 0]
 [0 0 0 0]
 [0 0 0 0]
 [0 0 0 0]
 [0 0 0 0]]

另一种选择是使用scipy.sparse.lil_matrix

a = scipy.sparse.lil_matrix((2750086,1000), dtype=int8 )

这似乎更有效地设置元素(如a[1,1]=2)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多