您是否知道任何适合存储大型非结构化列表的Python库(例如a=[0,numpy.asarray([1,2,3])]
)?
到目前为止我看到的h5py不支持这种数据,而且泡菜似乎很慢。还有其他选择吗?
为了我的目的,我们可以假设我正在处理相同类型的数据(具有int类型的numpy数组)但形状不同。
答案 0 :(得分:0)
如果您认为Pickle和cPickle太慢,您应该查看Marshall或Shelve,因为它们是另外两个主要的现成序列化库。如果这对您不起作用,您将需要开始使用合法数据库。
毕竟,快速存储和检索大量数据的能力基本上就是数据库,而这些压缩模块只会让你走得那么远。如果它们很完美,你就不需要数据库了。
如果您不想使用其中任何一种,那么实际上有专门用于此目的的工具,但我觉得这将是一次性的。您可以查看here这样的服务,但还有一些服务。
答案 1 :(得分:0)
实际上你可以将这种数据存储和检索到hdf5
文件中,只需要一点点自定义逻辑:
import tables
import numpy as np
def store(filename, name, data):
with tables.openFile(filename, 'w') as store:
store.createGroup('/', name)
for i, item in enumerate(data):
store.createArray('/%s' % name, 'item_%s' % i, item)
def read(filename, name):
with tables.openFile(filename, 'r') as store:
nodes = store.listNodes('/%s' % name)
data = [0] * len(nodes)
for node in nodes:
pos = int(node.name.split('_')[-1])
data[pos] = node.read()
return data
用法:
>>> a = [0, np.array([4,5,6])]
>>> store('my_data.h5', 'a', a)
>>> print read('my_data.h5', 'a')
[0, array([4, 5, 6])]
这只是我想到的第一件事,我确信有一种更有效的方式将列表存储到hdf5
个文件中。但是,让我们花时间看看即使这个天真的实现是否比cPickle
更快:
In [7]: a = []
for i in range(1, 500):
if i % 10 == 0:
a.append(i)
else:
a.append(np.random.randn(i, i))
In [8]: %%timeit
store('my_data.h5', 'a', a)
read_data = read('my_data.h5', 'a')
1 loops, best of 3: 1.32 s per loop
In [9]: %%timeit
with open('test.pickle', 'wb') as f:
cPickle.dump(a, f)
with open('test.pickle', 'rb') as f:
read_data = cPickle.load(f)
1 loops, best of 3: 1min 58s per loop
根据数据,差异更大或更小。但对于包含cPickle
数组的任何数据,即使这个愚蠢的实现至少比numpy
快10倍。