Deserialisieren einer riesigen JSON-Zeichenfolge für Python-Objekte

8

Ich verwende Simplejson, um JSON-String zu Python-Objekten zu deserialisieren. Ich habe einen benutzerdefinierten geschriebenen object_hook, der sich um die Deserialisierung des JSON zurück zu meinen Domänenobjekten kümmert.

Das Problem ist, wenn meine JSON-Zeichenkette riesig ist (d. h. der Server gibt etwa 800K Domain-Objekte in Form einer JSON-Zeichenkette zurück), benötigt mein Python-Deserializer fast 10 Minuten um sie zu deserialisieren.

Ich habe ein bisschen weiter gedrillt und es sieht so aus, als ob simplejson als solches nicht viel Arbeit macht, sondern alles an den object_hook delegiert. 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 ein anderes Standardframework, das für die Verarbeitung großer Datenmengen optimiert ist, oder gibt es eine Möglichkeit, die Fähigkeiten des Frameworks zu nutzen, anstatt alles auf object_hook-Ebene zu tun?

Ich sehe, dass ohne object_hook das Framework nur eine Liste von Dictionaries und nicht eine Liste von Domain-Objekten zurückgibt.

Irgendwelche Zeiger hier sind nützlich.

FYI Ich benutze Simplejson Version 3.7.2

Hier ist mein Beispiel _object_hook:

%Vor%

A Beispielantwort:

%Vor%

Ich habe viele Verschachtelungsebenen und die Anzahl der Datensätze, die ich vom Server erhalte, ist mehr als 800K.

    
pragnya 16.06.2016, 14:11
quelle

1 Antwort

6

Ich kenne kein Framework, das bietet, was Sie suchen, aber Sie können einige Optimierungen auf die Art und Weise anwenden, wie Ihre Klasseninstanz eingerichtet wird.

Da das Auspacken des Wörterbuchs in Schlüsselwortargumente und deren Anwendung auf Ihre Klassenvariablen den größten Teil der Zeit in Anspruch nimmt, sollten Sie das dct direkt an Ihre Klasse __init__ übergeben und das Klassenwörterbuch cls.__dict__ mit einrichten dct :

Versuch 1

%Vor%

Versuch 2

%Vor%

Es wird keine Sorge geben, dass self.__dict__ über eine andere Referenz geändert wird, da der Verweis auf dct verloren geht, bevor _object_hook zurückkehrt.

Dies bedeutet natürlich, dass Sie die Einrichtung Ihres __init__ ändern müssen, wobei die Attribute Ihrer Klasse streng von den Elementen in dct abhängen. Es liegt an dir.

Sie können auch cls != None durch cls is not None ersetzen (es gibt nur ein None Objekt, so dass eine Identitätsprüfung mehr pythonisch ist):

Versuch 1

%Vor%

Versuch 2

%Vor%

Und Sie können zwei Zeilen durch eins ersetzen mit:

%Vor%

wird:

%Vor%

Auf einer Skala von 800K Domänenobjekten würden Sie dadurch eine Menge Zeit sparen, wenn Sie object_hook benötigen, um Ihre Objekte schneller zu erstellen.

    
Moses Koledoye 18.06.2016 21:03
quelle