我正在向磁盘写一个巨大的字典 - 它在内存中处理得很好,但是当我输出它时,我得到一个与写入的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
在文件上执行尾部(等待一段时间)...
答案 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()
开头的方式相反。