Sto usando simplejson per deserializzare la stringa json in oggetti python. Ho un object_hook personalizzato che si occupa della deserializzazione del json nei miei oggetti di dominio.Deserializzazione di un'enorme stringa json su oggetti python
Il problema è che quando la mia stringa json è enorme (ovvero il server restituisce oggetti di dominio 800 KB sotto forma di una stringa json), il mio deserializzatore Python impiega quasi 10 minuti per deserializzarli.
Mi sono perforato un po 'più in là e sembra un semplice json in quanto tale non sta facendo molto lavoro, piuttosto sta delegando tutto a object_hook. Ho provato a ottimizzare il mio object_hook ma anche questo non migliora le mie prestazioni. (Difficilmente ho ottenuto 1 miglioramento minimo)
La mia domanda è, abbiamo qualche altro framework standard che è ottimizzato per gestire enormi set di dati o c'è un modo in cui posso utilizzare le capacità del framework piuttosto che fare tutto a livello object_hook .
Vedo che senza object_hook il framework restituisce solo un elenco di dizionari non un elenco di oggetti di dominio.
Qualsiasi suggerimento qui sarà utile.
FYI Sto usando simplejson versione 3.7.2
Ecco il mio _object_hook campione:
def _object_hook(dct):
if '@CLASS' in dct: # server sends domain objects with this @CLASS
clsname = dct['@CLASS']
# This is like Class.forName (This imports the module and gives the class)
cls = get_class(clsname)
# As my server is in java, I convert the attributes to python as per python naming convention.
dct = dict((convert_java_name_to_python(k), dct[k]) for k in dct.keys())
if cls != None:
obj_key = None
if "@uuid"in dct
obj_key = dct["@uuid"]
del(dct["@uuid"])
else:
info("Class missing uuid: " + clsname)
dct.pop("@CLASS", None)
obj = cls(**dct) #This I found to be the most time consuming process. In my domian object, in the __init__ method I have the logic to set all attributes based on the kwargs passed
if obj_key is not None:
shared_objs[obj_key] = obj #I keep all uuids along with the objects in shared_objs dictionary. This shared_objs will be used later to replace references.
else:
warning("class not found: " + clsname)
obj = dct
return obj
else:
return dct
Una risposta Esempio:
{"@CLASS":"sample.counter","@UUID":"86f26a0a-1a58-4429-a762- 9b1778a99c82","val1":"ABC","val2":1131,"val3":1754095,"value4": {"@CLASS":"sample.nestedClass","@UUID":"f7bb298c-fd0b-4d87-bed8- 74d5eb1d6517","id":1754095,"name":"XYZ","abbreviation":"ABC"}}
Ho molti livelli di nidificazione e il numero di record che sto ricevendo dal server è più di 800K.
Sembra interessante. Sarebbe utile qualsiasi frammento di esempio per controllarlo rapidamente. –
Se potessi pubblicare il codice della funzione 'object_hook' e un campione del JSON che vuoi analizzare, questo ci aiuterebbe a rispondere alla tua domanda. – jstlaurent