我经常处理大量数据(几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
变量,并重新创建图形并将其返回。但是,我希望已经有类似的东西。
答案 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)