Pickle 文件内存错误 - klepto 问题
Pickle File Memory Error - kelpto questoin
我在尝试为深度学习问题 pickle 大型 numpy 数组时遇到内存错误 shape: (7451, 1500, 1500, 1))
。也就是说,我在 klepto
上看到了一些帖子并阅读了文档,但我不确定如何实际使用 klepto
来保存为 pickle 文件。
谁能帮我把它分解成五年级的水平?
这是抛出内存错误:
pickle_out = open("X.pickle", "wb")
pickle.dumps(X, pickle_out)
pickle_out.close()
当我遇到类似问题时,我可以使用 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')
我是 klepto
的作者。如果你确实只是想 pickle 一个 numpy
数组,最好的方法是在 array
上使用 built-in dump
方法(除非数组太大适合内存限制)。
几乎所有执行序列化的代码都使用序列化包之一(dill
、cloudpickle
或 pickle
),除非对象有序列化方法 built-in本身,就像在 numpy
中一样。 joblib
使用 cloudpickle
,cloudpickle
和 dill
都使用 numpy
数组本身提供的内部序列化(pickle
不使用它,因此序列化膨胀并可能导致内存故障)。
>>> import numpy as np
>>> a = np.random.random((1500,1500,1500,1))
>>> a.dump('foo.pkl')
如果以上仍然给你内存错误,那么 joblib
、klepto
、dill
或其他方法真的帮不了你,除非你将数组分解成更小的数组块——或者可能使用 dask
数组(专为大型数组数据设计)。我认为你的数组足够大,它 应该 导致内存错误(我在我自己的系统上测试过它)即使使用上述最佳有效方法,所以你要么需要打破将数组分成块,或将其存储为 dask
数组。
明确地说,klepto
适用于大型 non-array 数据(如表格或字典),而 dask
适用于大型数组数据。
另一种选择是使用 numpy.memmap
数组,它直接将数组写入文件——绕过内存。这些使用起来有点复杂,而这正是 dask
试图通过一个简单的界面为您做的。
我在尝试为深度学习问题 pickle 大型 numpy 数组时遇到内存错误 shape: (7451, 1500, 1500, 1))
。也就是说,我在 klepto
上看到了一些帖子并阅读了文档,但我不确定如何实际使用 klepto
来保存为 pickle 文件。
谁能帮我把它分解成五年级的水平?
这是抛出内存错误:
pickle_out = open("X.pickle", "wb")
pickle.dumps(X, pickle_out)
pickle_out.close()
当我遇到类似问题时,我可以使用 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')
我是 klepto
的作者。如果你确实只是想 pickle 一个 numpy
数组,最好的方法是在 array
上使用 built-in dump
方法(除非数组太大适合内存限制)。
几乎所有执行序列化的代码都使用序列化包之一(dill
、cloudpickle
或 pickle
),除非对象有序列化方法 built-in本身,就像在 numpy
中一样。 joblib
使用 cloudpickle
,cloudpickle
和 dill
都使用 numpy
数组本身提供的内部序列化(pickle
不使用它,因此序列化膨胀并可能导致内存故障)。
>>> import numpy as np
>>> a = np.random.random((1500,1500,1500,1))
>>> a.dump('foo.pkl')
如果以上仍然给你内存错误,那么 joblib
、klepto
、dill
或其他方法真的帮不了你,除非你将数组分解成更小的数组块——或者可能使用 dask
数组(专为大型数组数据设计)。我认为你的数组足够大,它 应该 导致内存错误(我在我自己的系统上测试过它)即使使用上述最佳有效方法,所以你要么需要打破将数组分成块,或将其存储为 dask
数组。
明确地说,klepto
适用于大型 non-array 数据(如表格或字典),而 dask
适用于大型数组数据。
另一种选择是使用 numpy.memmap
数组,它直接将数组写入文件——绕过内存。这些使用起来有点复杂,而这正是 dask
试图通过一个简单的界面为您做的。