如何在Python中保存大(不是巨大的)词典?

时间:2012-02-10 18:37:21

标签: python file-io dictionary numpy scipy

我的词典将包含数千个键,每个键具有1000x1000 numpy数组作为值。我不需要该文件是人类可读的。小尺寸和快速装载时间更重要。

首先我尝试了savemat,但我遇到了problemsPickle导致了一个巨大的文件。我对csv假设相同。我已经阅读了推荐使用json(可读文本可能很大)或db(假设复杂)的帖子。你会为我的案子推荐什么?

5 个答案:

答案 0 :(得分:6)

如果你有一个字典,其中键是字符串,值是数组,如下所示:

>>> import numpy
>>> arrs = {'a': numpy.array([1,2]),
            'b': numpy.array([3,4]),
            'c': numpy.array([5,6])}

您可以使用numpy.savez按键将它们保存到压缩文件中:

>>> numpy.savez('file.npz', **arrs)

要加载它:

>>> npzfile = numpy.load('file.npz')
>>> npzfile
<numpy.lib.npyio.NpzFile object at 0x1fa7610>
>>> npzfile['a']
array([1, 2])
>>> npzfile['b']
array([3, 4])
>>> npzfile['c']
array([5, 6])

答案 1 :(得分:3)

文件系统本身通常是一种未被充分认识的数据结构。您可以拥有一个字典,它是从键到文件名的映射,然后每个文件中都包含1000x1000数组。挑选字典会很快捷,然后数据文件就可以包含原始数据(numpy很容易加载)。

答案 2 :(得分:2)

numpy.savez怎么样?它可以保存多个numpy数组,它们是二进制的,所以它应该比pickle更快。

答案 3 :(得分:0)

Google的Protobuf规范旨在提高开销效率。我不确定(de)序列化的速度有多快,但作为谷歌,我想它并不简陋。

答案 4 :(得分:0)

您可以使用PyTables(http://www.pytables.org/moin),并以HDF5格式保存数据。