在Python中存储大型非结构化列表

2024-04-26 20:19:48 发布

您现在位置:Python中文网/ 问答频道 /正文

你知道有没有适合存储大型非结构化列表的Python库(例如a=[0,numpy.asarray([1,2,3])])?在

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

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


Tags: 数据目的numpy类型列表数组pickleint
2条回答

如果您认为Pickle和cPickle太慢了,您应该研究一下Marshall或{a2},因为它们是另外两个主要的现成序列化库。如果这对你不起作用,你就要开始使用合法的数据库了。在

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

如果你不想使用这两种工具中的任何一种,实际上有专门用于此目的的工具,但我觉得这是一次性的。您可以在here中查找一个这样的服务,但是还有几个服务。在

实际上,您可以使用一点自定义逻辑将这类数据存储并检索到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

用法:

^{pr2}$

这只是我想到的第一件事,我确信有一种更有效的将列表存储到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

根据数据的不同,差异甚至更大或更小。但是对于任何包含numpy数组的数据,即使这种愚蠢的实现也比cPickle快至少10倍。在

相关问题 更多 >