2012-04-19 16 views
1

私はファイルセットにアクセスできます(それぞれ約80-800mb)。残念ながら、すべてのファイルには1行しかありません。この行には、厳密に1つのJSONオブジェクト(リストのリスト)が含まれています。小さなJSONオブジェクトにロードして解析するには、どうすればよいでしょうか?大きなJSONリストをPythonで読み込むにはどうすればよいですか?

+3

私はあなたが少なくとも[標準jsonモジュール](http://docs.python.org/library/json.html)と考えています。 – C2H5OH

+0

[95MBのJSONアレイを分割して小さなチャンクに分割するのは可能でしょうか?](http://stackoverflow.com/questions/7052947/split-95mb-json-array-into-smaller-chunks) –

+0

@ C2H5OH - はい、私は全体をメモリにロードしないようにしています。 –

答えて

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シェルが言ったことです – ashish

3

あなたがメモリに全体のリストを読み込む避けるためにしようとしている場合は、あなたが最初のテキストとしてファイルを処理できます。

は、オープンを追跡するために、スタックを使用し、括弧/引用符の閉じ方。オープナーのいずれか、または現在の近くの文字列をスキャンします。テキストをスキャンするときは、テキストをより近くに見るだけです。開幕戦を読んだときに1つを押すと、開幕戦を読んだときにポップする。 、{>] - - >}" - >"

JSONのためのフルセットは[です。あなたは\"を除外する必要があります。 ]が発生し、スタックが唯一一致[をポップしたあとに1つのアイテム(トップレベルを「[」)持っている時はいつでもあなたが次にhttp://www.json.org/

でスペックを確認することができ、その後、あなたはそれが新しい行を開始する時間です知っています。

最後に、最初のと最後の]が出力に表示されないようにする必要があります。

これにより、リストの各項目ごとに別々のJSONオブジェクトが作成され、それぞれがファイルの別々の行に表示されます。

Python JSONライブラリを調べると、JSONも解析する関数があるはずです。パブリックインターフェイスの一部ではないものの、それらを活用することができます。

もちろん、JSONライブラリを使用して文字列を読み込んだ後、もう1つの答えに応じてアイテム(または複数のアイテム)をダンプすることで、同じ結果を達成できます。

+1

完全に良いjsonモジュールが標準ライブラリに付属しているときに、この低レベルのスキャン方法が必要なのはなぜですか? @リンカの答えを参照してください – jdi

+0

私は彼が実際にメモリに格納されているjsonオブジェクトを持つメモリオーバーヘッドを持っていないと思う。 jsonライブラリの公開インタフェースはそれを許しません。私は彼がそのライブラリをハックし、ヘルパー関数のいくつかを使用することができますが、私はそれらを見ていませんが、言及しています。 – chees

+0

はい、他の回答に示唆されているように、メモリの懸念は実際には一度のバッチ処理では問題になりません。小さなオブジェクトにバッチ処理するだけの生産的なソリューションである必要はありません。 – jdi

0

モジュールpandas 0.21.0は、read_jsonの一部としてchunkksizeをサポートするようになりました。

import pandas as pd 
chunks = pd.read_json(file, lines=True, chunksize = 100) 
for c in chunks: 
    print(c) 
関連する問題