我有一个 REST API ( RavenDB's Query Streaming),它以 JSON 格式返回很多数据。一次性加载到内存和解析太多了:
问题在于,它不是“每行一个文档”,这会使它变得非常容易,而是在名为“结果”的字段中返回一个包含我们文档的字符串,如下所示:
{"Results":[
{"Name":"Hello World"}
]}
我真正想做的是使用 python 的请求库来流式传输响应,如下所示:
r = requests.get('.../streams/query/Raven/DocumentsByEntityName?query=', stream=True)
for chunk in r.iter_content(chunk_size=512, decode_unicode=False):
print chunk
但我想生成单独的 JSON 文档,这样就不必解析整个响应。一次生成一个 JSON 文档的最有效方法是什么?
最佳答案
json.load()
有一个可选的 object_pairs_hook
参数,您可以使用它。这个想法是捕获每个内部 dict
,从你的回调函数返回一个空的字典(或者可能是 None
)以避免建立巨大的数据结构在内存中。
请记住,这不是性能优化:在我的测试中(使用 import simplejson as json
),我发现虽然我可以节省内存,但使用钩子(Hook)检查每个元素使得解析实际上慢了好几倍。不过,如果您的内存力不足,总比没有好。
关于Python 从流中生成 JSON 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22785846/