【问题标题】:Pickle File Memory Error - kelpto questoinPickle 文件内存错误 - klepto 问题
【发布时间】:2019-05-22 15:43:26
【问题描述】:

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

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

这是抛出内存错误:

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

【问题讨论】:

  • 您遇到的内存错误可能是因为您尝试腌制的对象太大而无法保存在内存中。我只在解析 xml 文件时遇到过这种情况(将整个文件加载到内存中然后尝试解析它)。我通过迭代解析解决了它。 Pickle 有一个 dumpdumps 方法...你可以使用 dumps 并迭代地将其写入文件吗?
  • 嗨@rong。我尝试转储并得到以下错误:TypeError: an integer is required (got type _io.BufferedWriter) 我添加了上面使用的代码。

标签: python pickle klepto


【解决方案1】:

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

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

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

如果上面仍然给你一个内存错误,那么joblibkleptodill,或者除非你把数组分成更小的块——或者可能使用@ 987654339@数组(专为大数组数据设计)。我认为您的数组足够大,即使使用上述最佳有效方法,它应该会导致内存错误(我在自己的系统上对其进行了测试),因此您要么需要将数组分成块,或将其存储为dask 数组。

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

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

【讨论】:

    【解决方案2】:

    当我遇到类似问题时,我可以使用 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')
    

    【讨论】:

    • 嗨@Igorsharm。谢谢你。这会将它保存到哪里?
    • 这不适用于所述数组的大小,除非您的计算机具有大量内存。
    • 它将保存到当前目录中一个名为array.sav的文件中
    • @MikeMcKerns 这仅适用于一些大对象,即使可以使用pickle也无法保存它们,最近我用它来保存12GB稀疏矩阵,所以它应该可以解决问题也表示。无论如何,感谢您在另一个答案中对主题的解释,这对我也很有用!
    • 它绝对适用于一些无法用pickle 序列化的大型对象,因为它使用numpy 中包含的dump,而不是pickle。但是,我的观点是它会达到大小限制,OP 的给定大小 array 可能会达到这个大小限制(取决于您的机器)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    相关资源
    最近更新 更多