12

1.7 GB の JSON ファイルを開こうとするとjson.load()、メモリ エラーが発生します。Python で JSON ファイルを読み取るにはどうすればよいですか?

私の JSON ファイルは、特定のキーを含むオブジェクトの大きな配列です。

編集:オブジェクトの大きな配列が 1 つだけで、オブジェクトの構造が事前にわかっている場合は、1 行ずつ読み取ることができるツールを使用する必要はありません。行には、配列の要素が 1 つだけ含まれます。それがjsonファイルの保存方法であることに気付きました。私にとっては、次のように機能しました。

>>>for line in open('file.json','r').readline():
...    do something with(line) 
4

5 に答える 5

14

yajlのようなインクリメンタル json パーサーと、その python バインディングの 1 つが必要です。インクリメンタル パーサーは、入力からの読み取りをできるだけ少なくし、意味のあるものがデコードされたときにコールバックを呼び出します。たとえば、大きな json ファイルから数値のみを取得するには、次のようにします。

class ContentHandler(YajlContentHandler):
    def yajl_number(self, ctx, val):
         list_of_numbers.append(float(val))

parser = YajlParser(ContentHandler())
parser.parse(some_file)

詳細については、 http://pykler.github.com/yajl-py/を参照してください。

于 2012-05-23T07:53:04.010 に答える
4

ijsonであるyajlライブラリの周りに別の python ラッパーを見つけました。

次の理由により、 yajl-pyよりもうまく機能します。

  • yajl-py は私のシステムで yajl ライブラリを検出しませんでした。動作させるためにコードをハックする必要がありました
  • ijson コードはよりコンパクトで使いやすい
  • ijson は yajl v1 と yajl v2 の両方で動作し、純粋な python yajl 置換も備えています。
  • ijson には非常に優れた ObjectBuilder があり、イベントだけでなく、解析されたストリームから意味のあるサブオブジェクトを指定したレベルで抽出するのに役立ちます
于 2015-04-17T22:25:23.590 に答える