泡菜文件内存错误-kelpto questoin

时间:2019-05-22 15:43:26

标签: python pickle klepto

当尝试为深度学习问题shape: (7451, 1500, 1500, 1))腌制一个大的numpy数组时,出现内存错误。也就是说,我在klepto上看到了几篇文章,并阅读了文档,但是我不确定如何实际使用klepto来保存为pickle文件。

有人可以帮我把它分解到五年级吗?

这会引发内存错误:

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

2 个答案:

答案 0 :(得分:2)

我是klepto的作者。如果您确实确实在尝试腌制numpy数组,则最好的方法是仅在dump上使用内置的array方法(除非数组太大而无法放入内存限制)。

几乎所有执行序列化的代码都使用序列化软件包之一(dillcloudpicklepickle),除非对象本身内置了序列化方法,例如numpyjoblib使用cloudpickle,而cloudpickledill都利用numpy数组本身提供的内部序列化(pickle不使用它,从而导致序列化膨胀,并可能导致内存故障。

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

如果以上内容仍然给您带来内存错误,那么除非您将数组分成较小的块,否则joblibkleptodill或其他方式实际上无法为您提供帮助- -或可能使用dask数组(它是为大型数组数据设计的)。我认为您的数组足够大,即使使用上述最佳有效方法,它也会引起内存错误(我在自己的系统上对其进行了测试),因此您要么需要将数组分成多个块,或将其存储为dask数组。

请注意,klepto用于大型非数组数据(如表或字典),而dask用于大型数组数据。

另一种选择是使用numpy.memmap数组,该数组将数组直接写入文件-绕过内存。这些操作有点复杂,dask试图通过一个简单的界面为您完成这些操作。

答案 1 :(得分: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')