大きなutf-8 jsonファイル(2.2 GB)をデコードしようとしています。私はそうのようなファイルを読み込む:2.2GB JSONファイルが一貫して解析されない
f = codecs.open('output.json', encoding='utf-8')
data = f.read()
Iのいずれかを実行しようとした場合:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-40-fc2255017b19> in <module>()
----> 1 j = jd.decode(data)
/usr/lib/python2.7/json/decoder.pyc in decode(self, s, _w)
367 end = _w(s, end).end()
368 if end != len(s):
--> 369 raise ValueError(errmsg("Extra data", s, end, len(s)))
370 return obj
371
ValueError: Extra data: line 1 column -2065998994 - line 1 column 2228968302
(char -2065998994 - 2228968302)
uname -m
がx86_64
と
json.load
、
json.loads
または
json.JSONDecoder().raw_decode
私はエラーを取得します
> python -c 'import sys;print("%x" % sys.maxsize, sys.maxsize > 2**32)'
('7fffffffffffffff', True)`
だから私は64ビットでなければならず、整数のサイズは問題ではないはずです。私が実行した場合
しかし、:
jd = json.JSONDecoder()
len(data) # 2228968302
j = jd.raw_decode(data)
j[1] # 2228968302
raw_decode
で返されるタプルの第二の値が文字列の末尾があるので、raw_decode
は、一見無ゴミでファイル全体を解析しているようです終わり。
だから、私はjsonとは違ったやり方をしているはずですか? raw_decode
は実際にファイル全体をデコードしていますか? json.load(s)
はなぜ失敗しますか?
どのようなシステムを実行していますか? 2。符号付き32ビット整数の場合、20億は大きすぎます。例外詳細の負の数値は、問題が発生していることを示唆しています。 –
基礎となるコードを見ることなく、関数が入力を文字列に変換し、そのサイズの文字列を処理しようとするとオーバーフローの問題があることを推測します。 「生の」バージョンはおそらくそうではないので、すべてを解析することができます。 – Gabe
@TimPeters私はこれを私の質問に追加しましたが、私は64ビットアーキテクチャを採用しています。 –