Python 如何分割成块(子矩阵),或者处理一个巨大的矩阵,在numpy上给出内存错误?
我有一个非常大的矩阵,不能简单地放入内存。我必须使用的矩阵有Python 如何分割成块(子矩阵),或者处理一个巨大的矩阵,在numpy上给出内存错误?,python,python-3.x,numpy,matrix,large-data,Python,Python 3.x,Numpy,Matrix,Large Data,我有一个非常大的矩阵,不能简单地放入内存。我必须使用的矩阵有483798149136元素,这意味着有4830亿个浮点数 我所考虑的方法是,以某种方式将这个巨大的矩阵拆分成适合内存的不同子矩阵,对这些子矩阵执行操作,然后将它们全部合并回来,重建原始矩阵,希望在所有池操作之后能够适合内存 如果我错了,请纠正我,这个方法只是我想出的一个主意,它是好是坏,我不知道。如果你有更好的选择,我愿意接受任何建议 重现该矩阵的代码为: a = np.arange(695556).reshape(834,834)
483798149136
元素,这意味着有4830亿个浮点数
我所考虑的方法是,以某种方式将这个巨大的矩阵拆分成适合内存的不同子矩阵,对这些子矩阵执行操作,然后将它们全部合并回来,重建原始矩阵,希望在所有池操作之后能够适合内存
如果我错了,请纠正我,这个方法只是我想出的一个主意,它是好是坏,我不知道。如果你有更好的选择,我愿意接受任何建议
重现该矩阵的代码为:
a = np.arange(695556).reshape(834,834)
np.meshgrid(a,a)
我在同一个网站上读了一篇又一篇的文章,但没有一篇能真正解决这类问题,他们只是给出了模糊的建议
我现在的问题是:
事先非常感谢毕竟,我找到了解决问题的办法。这个巨大的矩阵可以很容易地使用。Dask是一个python库,它允许分布式计算和数据分块以优化内存使用。它非常方便,因为它确实允许您以真正低的计算和内存成本处理大量数据,显然,它的速度不如内存计算,但我认为很多人都会很高兴知道这一点 这个软件包经过了很好的优化,经常更新。最好的是它有numpy/pandas sintax,它也可以用与阵列相同的方式处理数据帧,如果你知道pandas/numpy,你会感觉像是在家里和dask在一起 您可以像这样创建dask分布式阵列:
import numpy as np
import dask.array as da
Y = da.random.normal(size=(695556, 695556),
chunks=(1000, 1000))
y = Y.mean(axis=0)[0:100].compute()
然后,您可以对其执行如下操作:
import numpy as np
import dask.array as da
Y = da.random.normal(size=(695556, 695556),
chunks=(1000, 1000))
y = Y.mean(axis=0)[0:100].compute()
此外,如果您使用内存分析器
,还可以监控内存和CPU使用情况,并查看计算所消耗的大量数据的内存量
我发现有一些实际的例子很能说明问题
此外,还可以找到此库中的解释数组范围
最后,是关于Python3.X中高性能计算的指南
希望这对解决同样问题的人有所帮助。您列出了一些好的选择。对于1,memmapped数组允许有选择地加载部分数据。它们只需很少的修改就可以处理大多数代码。3.“numexpr”与此类似,尽管它旨在提供内存局部性。它不会修复内存不足的错误,但使用memmapped数组可以很好地工作。我将避免太多细节,因为我不知道您试图解决的确切问题。他们都已经足够成熟,可以在网上有很好的文档(memmap是numpy的一部分,它有非常全面的文档),我建议从stackoverflow的一些问题开始,只是为了了解可能的情况()。尽管如果您的最终输出适合内存,memmap阵列可能不是最佳选择。它们会引入相当多的磁盘读取开销。也许了解更多关于您正在使用的算法会有所帮助。有时候NumPy矢量化的方式在内存中可能会变得更昂贵,而Numba加速循环在使用很少内存的情况下可能会非常快。大家好。这个问题更新了关于我的工作和矩阵的额外信息。