-2

尝试为深度学习问题腌制大型 numpy 数组时出现内存错误shape: (7451, 1500, 1500, 1))。也就是说,我看到了一些帖子klepto并阅读了文档,但我不确定如何实际使用klepto来保存为泡菜文件。

谁能帮我把它分解到五年级?

这是抛出内存错误:

pickle_out = open("X.pickle", "wb")
pickle.dumps(X, pickle_out)
pickle_out.close()
4

2 回答 2

2

我是klepto作者。如果您确实只是想腌制一个numpy数组,最好的方法是只使用内置dump方法array(除非数组太大而无法适应内存限制)。

几乎所有进行序列化的代码都使用序列化包之一(dillcloudpicklepickle,除非对象本身内置了序列化方法,例如在numpy. joblib使用cloudpickle, 和两者cloudpickledill利用numpy数组本身提供的内部序列化(pickle不使用它,因此序列化膨胀并可能导致内存故障)。

>>> import numpy as np
>>> a = np.random.random((1500,1500,1500,1))
>>> a.dump('foo.pkl')

如果上述内容仍然给您带来内存错误,那么joblib, klepto,dill或其他方式真的无法帮助您,除非您将数组分解成更小的块 - 或者可能使用dask数组(专为大型数组数据设计)。我认为您的数组足够大,即使使用上述最佳有效方法,它也会导致内存错误(我在自己的系统上对其进行了测试),因此您要么需要将数组分成块,要么将其存储为dask数组.

需要明确的klepto是,适用于大型非数组数据(如表或字典),而dask适用于大型数组数据。

另一种选择是使用numpy.memmap数组,它直接将数组写入文件——绕过内存。这些使用起来有点复杂,并且是dask尝试通过简单的界面为您做的事情。

于 2019-05-22T18:29:33.213 回答
0

当我遇到类似问题时,我可以使用 joblib 解决它。您首先需要安装 sklearn 库,例如可以使用

pip install sklearn

这只是基本想法,要更好地了解如何安装它,请访问https://scikit-learn.org/stable/install.html 所以,一切都很简单,如下代码所示

from sklearn.externals import joblib
import numpy as np
array=np.array([0,1,2]) # thats explanatory array, you should use your instead

filename = 'array.sav'
joblib.dump(array, filename)  

然后,在您需要使用数据时加载数据:

array = load(filename, mmap_mode='r')
于 2019-05-22T16:23:16.147 回答