Ich verwende SimpleJson, um JSON-Zeichenfolge zu Python-Objekten zu deserialisieren. Ich habe einen benutzerdefinierten geschriebenen object_hook, der sich um das Deserialisieren des JSON zurück zu meinen Domain-Objekten kümmert.Deserialisieren einer riesigen JSON-Zeichenfolge zu Python-Objekten
Das Problem ist, wenn meine JSON-String ist riesig (d. H. Der Server ist rund 800K Domain-Objekte in Form einer JSON-String zurück), dauert mein Python Deserializer fast 10 Minuten zu deserialisieren sie.
Ich habe ein bisschen weiter gedrillt und es sieht so aus, als würde simplejson als solches nicht viel Arbeit machen, sondern delegiert alles an den object_hook. Ich habe versucht, meinen object_hook zu optimieren, aber das verbessert auch nicht meine Leistung. (Ich habe kaum 1 Minute Verbesserung)
Meine Frage ist, haben wir irgendein anderes Standardframework, das für große Datenmengen optimiert ist oder gibt es einen Weg, wo ich die Fähigkeiten des Frameworks nutzen kann, anstatt alles auf object_hook Ebene zu tun .
Ich sehe, dass ohne object_hook das Framework nur eine Liste der Wörterbücher nicht Liste der Domänenobjekte zurückgibt.
Alle Zeiger hier sind nützlich.
FYI I simplejson Version 3.7.2
Hier bin mit ist meine Probe _object_hook:
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
Eine Beispielantwort:
{"@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"}}
ich viele Verschachtelungsebenen haben und die Anzahl der Datensätze, die ich vom Server erhalte, sind mehr als 800K.
Scheint interessant. Ein Beispiel-Snippet, um es schnell zu überprüfen, wäre nützlich. –
Wenn Sie den Code Ihrer 'object_hook' Funktion und ein Beispiel des zu analysierenden JSONs posten könnten, würde uns das helfen, Ihre Frage zu beantworten. – jstlaurent