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
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
如果您认为Pickle和cPickle太慢了,您应该研究一下Marshall或{a2},因为它们是另外两个主要的现成序列化库。如果这对你不起作用,你就要开始使用合法的数据库了。在
毕竟,快速存储和检索大量数据的能力基本上就是一个数据库,而这些压缩模块只会让您走到这一步。如果它们是完美的,你就不需要数据库了。在
如果你不想使用这两种工具中的任何一种,实际上有专门用于此目的的工具,但我觉得这是一次性的。您可以在here中查找一个这样的服务,但是还有几个服务。在
实际上,您可以使用一点自定义逻辑将这类数据存储并检索到
hdf5
文件中:用法:
^{pr2}$这只是我想到的第一件事,我确信有一种更有效的将列表存储到
hdf5
文件中的模式。但是,让我们来计时,看看即使是这个朴素的实现是否比cPickle
快:根据数据的不同,差异甚至更大或更小。但是对于任何包含
numpy
数组的数据,即使这种愚蠢的实现也比cPickle
快至少10倍。在相关问题 更多 >
编程相关推荐