2012-04-19 27 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) 
相關問題