我想解碼一個大型的utf-8 json文件(2.2 GB)。我加載文件,如下所示:2.2GB JSON文件解析不一致
f = codecs.open('output.json', encoding='utf-8')
data = f.read()
如果我嘗試做任何的:json.load
,json.loads
或json.JSONDecoder().raw_decode
我得到的錯誤:
---------------------------------------------------------------------------
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
和
> 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位體系結構上。 –