2012-04-19 57 views
1

我可以访问一组文件(每个大约80-800mb)。不幸的是,每个文件只有一行。该行只包含一个JSON对象(列表的列表)。加载并将其解析为较小的JSON对象的最佳方式是什么?在Python中加载大型JSON列表的最佳方式是什么?

+3

我想您已经至少考虑[标准JSON模块(http://docs.python.org/library/json.html)。 – C2H5OH 2012-04-19 23:42:33

+0

[将95MB JSON数组拆分为更小的块?](http://stackoverflow.com/questions/7052947/split-95mb-json-array-into-smaller-chunks) – 2012-04-21 02:49:27

+0

@ C2H5OH - 是的,我是希望不将整个事物加载到内存中。 – 2012-04-23 05:30:23

回答

5

已有类似帖子here。这里是他们提出的解决方案:

import json 
with open('file.json') as infile: 
    o = json.load(infile) 
    chunkSize = 1000 
    for i in xrange(0, len(o), chunkSize): 
    with open('file_' + str(i//chunkSize) + '.json', 'w') as outfile: 
     json.dump(o[i:i+chunkSize], outfile) 
+1

遇难,这就是python shell所说的 – ashish 2013-07-22 15:48:40

3

如果你想避免加载整个列表到内存中,你可以先处理该文件为文本:

使用堆栈跟踪和开放关闭括号/引号。浏览任何开门人的字符串,或当前更近的字符串。在扫描文本时,只需查看更接近的文本。当你阅读开瓶器时推一个,当你找到更近的时候将其弹出。

的JSON的全套是[ - >]{ - >}" - >"。不过你应该排除\"。您可以在http://www.json.org/

检查规范然后,每当一个]遇到和堆栈只有一个项目啪匹配[后(顶级“[”),那么你就知道是时候开始新的一行。

最后,您应确保第一个[和上一个]不会出现在您的输出中。

这将为您提供单独的列表中的每个项目的JSON对象,每个项目在文件的单独一行上。

如果您深入了解python JSON库,应该有一些解析JSON的函数。即使它们不是公共接口的一部分,您也可以利用这些功能。

当然,您可以通过使用JSON库加载字符串,然后逐项(或多个项目)按照其他答案对其进行倾销来实现相同。

+1

当一个完美的json模块带有标准库时,为什么这个低级别的扫描方法是必要的?请参阅@链接器的答案 – jdi 2012-04-20 00:04:04

+0

我认为他不希望让json对象实际存储在内存中的内存开销。 json库的公共接口不允许这样做。我提到他虽然可以入侵该库并使用一些辅助函数,但我没有看过它们。 – chees 2012-04-20 00:06:01

+0

是的,但其他答案中建议的内存问题对于一次性批处理并不是真正的问题。它不一定是一个生产解决方案,只需将其批量化为较小的对象即可。 – jdi 2012-04-20 00:07:16

0

模块pandas 0.21.0现在支持块大小作为read_json的一部分。您可以加载并在同一时间处理一个块:

import pandas as pd 
chunks = pd.read_json(file, lines=True, chunksize = 100) 
for c in chunks: 
    print(c) 
相关问题