Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pickle文件内存错误-kelpot questoin_Python_Pickle_Klepto - Fatal编程技术网

Python Pickle文件内存错误-kelpot questoin

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解决

我在尝试为深度学习问题pickle一个大的numpy数组时遇到了一个内存错误
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')