Python Pickle文件内存错误-kelpot questoin
我在尝试为深度学习问题pickle一个大的numpy数组时遇到了一个内存错误Python Pickle文件内存错误-kelpot questoin,python,pickle,klepto,Python,Pickle,Klepto,我在尝试为深度学习问题pickle一个大的numpy数组时遇到了一个内存错误shape:(7451150015001))。也就是说,我在klepot上看到了一些帖子并阅读了文档,但我不确定如何实际使用klepot保存为pickle文件 有人能帮我把它降到五年级吗 这将引发内存错误: pickle_out = open("X.pickle", "wb") pickle.dumps(X, pickle_out) pickle_out.close() 当我遇到类似的问题时,我可以使用joblib解决
shape:(7451150015001))
。也就是说,我在klepot
上看到了一些帖子并阅读了文档,但我不确定如何实际使用klepot
保存为pickle文件
有人能帮我把它降到五年级吗
这将引发内存错误:
pickle_out = open("X.pickle", "wb")
pickle.dumps(X, pickle_out)
pickle_out.close()
当我遇到类似的问题时,我可以使用joblib解决它。您首先需要安装sklearn库,例如可以通过
pip install sklearn
这只是一个基本概念,要更好地了解如何安装它,请访问
所以,一切都是非常平面的,并在下面的代码中进行了说明
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')
我是《密码》的作者。如果您确实只是尝试对
numpy
数组进行pickle,那么最好的方法就是在数组上使用内置的dump
方法(除非数组太大,无法满足内存限制)
几乎所有进行序列化的代码都使用其中一个序列化包(dill
、cloudpickle
或pickle
),除非对象本身内置了序列化方法,如numpy
joblib
使用cloudpickle
,而cloudpickle
和dill
都使用numpy
数组本身提供的内部序列化(pickle
不使用它,因此序列化会膨胀并可能导致内存故障)
如果上面的操作仍然给您带来内存错误,那么joblib
、klepot
、dill
,或者其他方法确实无法帮助您,除非您将数组分解为更小的块,或者可能使用dask
数组(专为大数组数据设计)。我认为您的数组足够大,即使使用上述最有效的方法,也会导致内存错误(我在自己的系统上对其进行了测试),因此您需要将数组分成块,或者将其存储为dask
数组
需要明确的是,klepot
适用于大型非数组数据(如表或dict),而dask
适用于大型数组数据
另一种选择是使用numpy.memmap
数组,它直接将数组写入文件——绕过内存。使用起来有点复杂,dask
试图通过一个简单的界面为您做些什么。您得到的内存错误可能是因为您试图pickle的对象太大,无法保存在内存中。我只在解析xml文件时遇到过这种情况(将整个文件加载到内存中,然后尝试解析它)。我通过迭代解析解决了这个问题。Pickle有一个转储
和转储
方法。。。您可以使用转储文件并将其迭代写入文件吗?您好。我尝试转储并得到以下错误:TypeError:需要一个整数(get type\u io.BufferedWriter)
我添加了上面使用的代码。Hi@Igorsharm。非常感谢。这将保存到哪里?这不适用于所述数组的大小,除非您的计算机内存很大。它将保存到名为array.sav
@MikeMcKerns的文件中的当前目录。这只适用于某些大型对象,即使可以使用pickle也无法保存,最近我用它来保存12GB的稀疏矩阵,所以它应该也适用于所述的问题。无论如何,谢谢你在另一个答案中对这个主题的解释,它对我也很有用!它绝对适用于某些无法用pickle
序列化的大型对象,因为它使用numpy
中包含的dump
,而不是pickle
。然而,我的观点是,它将达到一个大小限制,OP给定大小的数组可能会达到这个限制(取决于您的机器)。
>>> import numpy as np
>>> a = np.random.random((1500,1500,1500,1))
>>> a.dump('foo.pkl')