有效地保存到列表,元组和NumPy阵列的磁盘(异构)图形

时间:2016-01-27 16:15:55

标签: python arrays numpy serialization storage

我经常处理大量数据(几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中,展平整个图形并存储{{1}使用nest_structure和所有展平的数据。然后,numpy.load周围的相应包装器将理解numpy.savez_compressed变量,并重新创建图形并将其返回。但是,我希望已经有类似的东西。

1 个答案:

答案 0 :(得分:0)

您可能喜欢shelve套餐。它有效地将异构的pickle对象包装在方便的文件中。与传统的存档到文件模型相比,shelve更倾向于“持久存储”。

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

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

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)