Ich benutze RapidJSON, um große GeoJSON-Dateien zu analysieren. Der größte Teil des Inhalts in diesen Dateien (und damit der Speicher nach dem Parsen) sind riesige Koordinatenfelder. Für meine Bewerbung interessiert mich das nicht. Ich würde es vorziehen, sie zu überspringen (nicht Speicher für sie zu reservieren) beim Parsen. Basierend auf einigen Tests mit der SAX API, erwarte ich, dass dies die Geschwindigkeit des Parsings ungefähr verdoppelt.Überspringe bestimmte Felder beim Parsen eines Dokuments mit RapidJSON
Mein erster Gedanke war, eine benutzerdefinierte Handler zu schreiben. Ich müsste mein eigenes Value-Objekt erstellen, indem ich meinen eigenen Stack verwende, aber was die Klasse GenericDocument
erledigt.
Mein nächster Gedanke war die Unterklasse GenericDocument
. Seine ParseStream
und Handler-Methoden sind jedoch nicht virtual
, so dass ich es nicht nutzen kann, meine eigenen zu verwenden. Ich könnte meine eigene ParseStream
implementieren, aber das stack_
Feld ist privat, so dass sogar eine Unterklasse nicht darauf zugreifen kann.
Ist ein benutzerdefinierter Handler mit seinem eigenen Stack der richtige Weg, um hier zu gehen? Hat jemand so etwas schon einmal gemacht?
FWIW, hier ist eine [Version] (https://gist.github.com/danvk/90beec9f0387788eca9c1ba8402dbee1), die 'GenericValue' mit einer eigenen Stack- und Handler-Implementierung abbildet. Es funktioniert und ist schnell, lässt aber hinsichtlich der Code-Duplikation viel zu wünschen übrig. Ich würde gerne ein Feedback darüber bekommen, ob es einen besseren Ansatz gibt. – danvk