在python中编写大量字典到文件

时间:2014-09-27 11:25:44

标签: python json

我正在向磁盘写一个巨大的字典 - 它在内存中处理得很好,但是当我输出它时,我得到一个与写入的json不完整相关的错误。如何写出或流出大量字典?

我使用以下内容:

jsontext = json.dumps(data_dict)
f = open(pre_data_file, 'w')
f.write(jsontext)
f.close()

f = open(predump_file, 'r')
jsontxt = f.read()
f.close()
sample_dict = dict(json.loads(jsontxt))

我的文件大小(不完整)是:~300M

这是追溯

Traceback (most recent call last):
  File "Combine.py", line 675, in <module>
    sample_range = dict( json.loads(jsontxt))
ValueError: dictionary update sequence element #0 has length 1; 2 is required

在文件上执行尾部(等待一段时间)...

2 个答案:

答案 0 :(得分:1)

此答案是在编辑OP之前发布的,以包含json.loads()代码,报告dict构造函数异常的根本原因


格式开销

Python dict拥有自己的内存表示占用空间(格式开销)远远大于扁平,序列化的JSON格式。

JSON上的

json.dump()格式包装器会为格式正确的dict添加最小开销。

然而 json.dumps()变体将全长单一输出字符串再次存储到您的内存中。

内存占用要求

如果你的内存情况不允许,请尝试另一种处理策略,因为输出是按顺序生成的,而是在直接输出到文件的管道中,json.dump()提供工具,或 - 如果有一个复杂的dict结构 - 创建自己的dict切片迭代器,它会删除一级dict结构,并允许json.dump()按顺序遍历所有.keys() ,只处理dict[key]叶子的剩余深度 - 主要几乎就像这个琐碎的迭代器[ for aKey in data_dict: f.write( json.dump( aKey ) + ":" ), f.write( data_dict[aKey] ), ... ]

所有这些都不是为了使内存分配需求翻倍(您的代码有效地将data_dict的完整文本副本放入字符串变量jsontext中,并且您的操作系统将不得不处理大量内存交换,以防data_dict大小增长到您称之为大量的范围

使用

检查实际的data_dict情况和估计的内存需求

data_dict.__sizeof__()

len( data_dict.keys() )

答案 1 :(得分:0)

您获得的错误与dict构造函数与已加载json的数据的使用有关。

当你这样做时:

sample_dict = dict(json.loads(jsontxt))

...你正在从python对象创建一个dict - 已经加载的dict,list等。所以基本上该对象必须有效才能作为参数传递给dict()构造函数。这相当于:

d1 = dict({'a': 1})  # works
d2 = dict(['a', 1])  # doesn't work and gives the
                     # error you got
d3 = dict(('a', 1))  # nope, same error

由于您已经使用loads()从文件加载字符串,因此您可以执行以下操作:

sample_dict = json.loads(jsontxt)

与你dumps()开头的方式相反。

顺便说一句,dump()load()直接使用文件,而不是在两者之间使用字符串来写入文件和从文件中读取数据。