【问题标题】:dumping several objects into the same file将多个对象转储到同一个文件中
【发布时间】:2016-02-13 16:29:38
【问题描述】:

假设我有一个包含大约 100k 对字符串的字典和一个形状为 (100k, 500) 的 numpy 矩阵。我想将它们保存到磁盘的同一个文件中。

我现在正在做的是使用 cPickle 转储字典,并使用 scipy.io.savemat 转储矩阵。这样,转储/加载非常快。但问题是,由于我使用不同的方法,我获得了 2 个文件,并且我希望只有一个文件包含我的 2 个对象。我该怎么做?

我可以在同一个文件中对它们进行 cPickle,但是 cPickle 在大数组上速度非常慢。

【问题讨论】:

  • 您是否尝试过使用更高的泡菜协议?协议 0 是 Python2.7 的默认值,它将所有内容转换为 ASCII,而协议 1 和 2 产生二进制输出(确保以二进制模式打开输出文件,即'wb' 而不是'w')。 joblib.dump 是序列化数组和 Python 对象的异构集合的另一种非常快速的方法。
  • 看看np.savez。它将每个变量保存到 zip 存档中的文件(可能已压缩)。您可以在字典或列表中打包一堆小的非 numpy 对象,这些对象将与 pickle 一起保存。 load 很懒。

标签: python numpy scipy pickle


【解决方案1】:

您可以使用dilldill.dump 访问并使用来自numpydump 方法来存储arraymatrix 对象,因此它的存储方式与您直接从numpy 对象上的方法执行存储的方式相同.您只需 dill.dump 字典即可。

dill 也能够以压缩格式存储泡菜,但速度较慢。正如 cmets 中提到的,还有joblib,它也可以和dill 做同样的事情……但基本上,joblib 利用cloudpickle(这是另一个序列化程序)或者也可以使用dill 来做序列化。

如果你有一个巨大的字典,并且不需要一次所有的内容......也许更好的选择是klepto,它可以使用高级序列化方法(来自dill)来存储dict到磁盘(或数据库)上的多个文件,您在内存中有一个代理dict,使您能够只获取您需要的条目。

所有这些包都为标准 python 和numpy 对象提供了一个快速统一的dump

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2017-05-11
    • 2017-10-25
    • 2021-11-13
    相关资源
    最近更新 更多