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

在Python中存储大型非结构化列表,python,large-files,h5py,Python,Large Files,H5py,您知道有哪些Python库适合存储大型非结构化列表(例如a=[0,numpy.asarray([1,2,3])]) 到目前为止,我所看到的h5py不支持这种数据,而且pickle似乎很慢。还有其他选择吗 出于我的目的,我们可以假设我正在处理相同类型(int类型的numpy数组)但形状不同的数据。如果您认为Pickle和cPickle太慢,您应该查看其中一个,或者因为它们是另外两个主要的现成序列化库。如果这对您不起作用,您将希望开始使用合法的数据库 毕竟,快速存储和检索大量数据的能力基本上就是数据

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

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


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

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

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

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

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

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

您使用了cPickle还是常规pickle?可能是@SlaterTyranus的重复,我认为这不是重复,因为他不存储
numpy
数组。在他给出的例子中,他也有标量值,也许谁知道是什么。总之,我认为这是一个比仅仅存储
numpy
数组更一般的问题。@ViktorKerkez在示例中是的,但在他的实际问题中,他说假设他只是使用int类型的numpy数组。无论哪种方式,问题都应该重新编写,但取决于OP实际提出的问题,它可能是重复的,也可能不是重复的。@m4linka:是否只存储
numpy
数组,如果是,则此问题是重复的。或者你想存储混合标量和
numpy
数组等等的列表。整洁,非常接近我需要的。谢谢。