Sto tentando di decodificare un grande file utf-8 json (2,2 GB). I caricare il file in questo modo:2,2 GB Il file JSON analizza in modo incoerente
f = codecs.open('output.json', encoding='utf-8')
data = f.read()
Se provo a fare qualsiasi di: json.load
, json.loads
o json.JSONDecoder().raw_decode
ottengo l'errore:
---------------------------------------------------------------------------
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
mostra x86_64
e
> python -c 'import sys;print("%x" % sys.maxsize, sys.maxsize > 2**32)'
('7fffffffffffffff', True)`
quindi dovrei essere su 64 bit e la dimensione dei numeri interi non dovrebbe essere un problema.
Tuttavia, se corro:
jd = json.JSONDecoder()
len(data) # 2228968302
j = jd.raw_decode(data)
j[1] # 2228968302
Il secondo valore nella tupla restituita da raw_decode
è la fine della stringa, in modo raw_decode
sembra per analizzare l'intero file con apparentemente senza spazzatura al fine.
Quindi, c'è qualcosa che dovrei fare diversamente con il json? Lo raw_decode
decodifica effettivamente l'intero file? Perché è json.load(s)
in errore?
Che tipo di sistema stai utilizzando? 2.2 miliardi sono troppo grandi per un numero intero a 32 bit con segno e i numeri negativi nei dettagli delle eccezioni suggeriscono che si stanno verificando dei problemi. –
Senza guardare il codice sottostante, ho intenzione di indovinare che le funzioni convertono l'input in una stringa e che hanno problemi di overflow che cercano di gestire una stringa di tale dimensione. La versione "raw" presumibilmente non lo è, e quindi è in grado di analizzare il tutto. – Gabe
@TimPeters Ho aggiunto questo alla mia domanda ma sono su un'architettura a 64 bit. –