【问题标题】:Efficiently save to disk (heterogeneous) graph of lists, tuples, and NumPy arrays有效地将列表、元组和 NumPy 数组的磁盘(异构)图保存到
【发布时间】:2016-01-27 16:15:55
【问题描述】:

我经常处理大量数据(数 GB 的数量级),这些数据以 NumPy 数组的形式存储在内存中。通常,我会处理此类 NumPy 数组的嵌套列表/元组。我应该如何将这些存储到磁盘?我想保留数据的列表/元组结构,必须压缩数据以节省磁盘空间,并且需要快速保存/加载。

(我现在面临的特定用例是一个包含 4000 个元素的长列表,由 2 元组 x 组成,其中 x[0].shape = (201,)x[1].shape = (201,1000)。)

我尝试了几种选择,但都有缺点:

  • pickle 存储到 gzip 存档中。这很好用,并且可以使用可接受的磁盘空间,但速度极慢,并且在节省时会消耗大量内存。

  • numpy.savez_compressed。比pickle 快得多,但不幸的是,它只允许使用一系列 numpy 数组(不是我所拥有的嵌套元组/列表)或指定参数的字典式方式。

  • 通过h5py 存储到 HDF5。这对于我相对简单的需求来说似乎太麻烦了。更重要的是,我对此进行了很多研究,而且似乎没有一种直接的方式来存储异构(嵌套)列表。

  • hickle 似乎完全符合我的要求,但不幸的是,它目前与 Python 3 不兼容(这是我正在使用的)。

我正在考虑围绕numpy.savez_compressed 编写一个包装器,它将确定数据的嵌套结构,将此结构存储在某个变量nest_structure 中,展平整个图形,并存储nest_structure 和所有展平的数据使用numpy.savez_compressed。然后,numpy.load 周围的相应包装器将理解nest_structure 变量,并重新创建图形并返回它。但是,我希望已经有类似的东西了。

【问题讨论】:

  • 你用的是什么版本的python? cPickle 存在于 python 2 中,并且比 pickle 快得多。
  • @Dunes Python 3,其中默认的pickle实现与Python 2的cPickle相同。

标签: python arrays numpy serialization storage


【解决方案1】:

您可能会喜欢shelve 包。它有效地将异构腌制对象包装在一个方便的文件中。 shelve 比经典的保存到文件模型更倾向于“持久存储”。

使用shelve 的主要好处是可以方便地保存大多数类型的结构化数据。使用 shelve 的主要缺点是它是特定于 Python 的。与 HDF-5 或保存的 Matlab 文件甚至简单的 CSV 文件不同,使用其他工具处理您的数据并不容易。

保存示例(出于习惯,我创建了对象并将它们复制到df,但您不需要这样做。您可以直接保存到df中的项目):

import shelve
import numpy as np
a = np.arange(0, 1000, 12)
b = "This is a string"
class C(object):
   alpha = 1.0
   beta = [3, 4]
c = C()
class C(object):
   alpha = 1.0
   beta = [3, 4]
c = C()
df = shelve.open('test.shelve', 'c')
df['a'] = a
df['b'] = b
df['c'] = c
df.sync()
exit()

按照上面的例子,恢复数据:

import shelve
import numpy as np
class C():
   alpha = 1.0
   beta = [3, 4]
df = shelve.open('test.shelve')
print(df['a'])
print(df['b'])
print(df['c'].alpha)

【讨论】:

  • 谢谢,但恐怕shelve 不会这样做。它是pickle 的包装器,对于我的需求来说太慢了(与gzip 结合时,请参阅原始帖子)或占用太多空间(不使用压缩时)。
猜你喜欢
  • 2015-05-20
  • 2018-10-26
  • 1970-01-01
  • 2017-12-08
  • 1970-01-01
  • 1970-01-01
  • 2018-08-31
  • 2017-04-11
  • 2020-02-06
相关资源
最近更新 更多