0

你知道有哪些 Python 库可以很好地存储大型非结构化列表(例如a=[0,numpy.asarray([1,2,3])])吗?

到目前为止我所看到的 h5py 不支持这种数据,并且 pickle 似乎很慢。还有其他选择吗?

出于我的目的,我们可以假设我正在处理相同类型的数据(具有 int 类型的 numpy 数组)但形状不同。

4

2 回答 2

0

如果您认为 Pickle 和 cPickle 太慢,您应该查看MarshallShelve,因为它们是另外两个主要的现成序列化库。如果这对您不起作用,您将要开始使用合法数据库。

毕竟,快速存储和检索大量数据的能力基本上就是数据库,而这些压缩模块只会让你走得更远。如果它们是完美的,您将不需要数据库。

如果您不想使用其中任何一个,实际上有专门用于此目的的工具,但我觉得这将是一次性的。您可以在这里寻找一项这样的服务,但还有更多。

于 2013-08-21T21:44:23.500 回答
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 倍。

于 2013-08-21T22:14:12.740 回答