2017-06-12 1 views
0

Meine Anwendung muss Daten in einer XML-Datei verwenden, die bis zu 5 GB groß ist. I Laden von Daten in Image Classed aus dem XML. Die Image-Klasse hat viele Attribute, wie Pfad, Name, MD5, Hash und viele andere Informationen wie diese.Umgang mit großen XM-Datei Java um 5 GB

Die 5-GB-Datei enthält etwa 50 Millionen Bilddaten. Wenn ich die XML-Datei parse, werden die Daten in die App geladen und die gleiche Anzahl von Bildklassen wird in der App erstellt und ich führe verschiedene Operationen und Berechnungen durch es.

Mein Problem ist, wenn ich eine solche Hugh-Datei analysieren meine Erinnerung auffressen. Ich denke, alle Daten werden in den RAM geladen. Aufgrund der Komplexität des Codes kann der gesamte Code nicht bereitgestellt werden. Ich habe dort einen effizienten Weg, mit so einer großen Anzahl von Klassen umzugehen. Ich habe die ganze Nacht geforscht, aber keinen Erfolg gehabt. Kann mir jemand in die richtige Richtung zeigen?

Dank

+0

Ich nehme an, dass Sie wissen, keinen DOM-Parser zu verwenden, sondern stattdessen einen Streaming-Parser wie SAX oder StAX, oder? Aber Sie erwähnen das nicht - warum? Wie genau ** sind Sie beim Parsen der Daten? –

+0

Ich benutze SAX-Parser, aber wegen einer so großen Menge an Daten, 50 Millionen Bildobjekte den App-Speicher auffressen, wenn ich den Speicher erhöhen die App funktioniert gut. Die App-Daten können auch von sqlite geladen werden, ich bekomme das gleiche Problem von dort auch, das Problem ist so eine große Menge an Daten, und ich denke, eine solche Menge Objekte sind alle im RAM. –

+0

Ja, nach dem Parsen der Xml die Daten speichern innerhalb der SQLite, wenn ich die Daten in Zukunft verwenden möchte, kann ich von SQLite, das ist viel schneller als das Parsen der XML, aber das Problem kommt, wenn die Menge der Daten, das Bild Klasse hat wichtige Parameter, wie Bildpfad, Name, also muss ich alle Daten zurück in die App laden, die wieder die gleiche Anzahl an Objekten erzeugen, –

Antwort

0

Sie benötigen eine Art Pipeline, die Daten weitergeben zu seinem eigentlichen Ziel, ohne jemals speichern sie alle im Speicher auf einmal

Ich weiß nicht, wie Sie Ihren Code, um das Parsen zu tun, aber Sie Sie müssen nicht alle Daten im Speicher speichern.

Hier ist eine sehr gute Antwort für implementation für

0

große XML-Dateien zu lesen Wenn Sie SAX verwenden, aber Sie sind Speicher zu essen, dann etwas, was Sie tun, ist falsch, und es gibt keine Art, wie wir sagen können, Sie, was Sie falsch machen, ohne Ihren Code zu sehen.

Ich empfehle, JVisualVM zu verwenden, um einen Heapspeicherauszug zu erhalten und zu sehen, welche Objekte den Arbeitsspeicher belegen, und dann den Teil der Anwendung zu untersuchen, der diese Objekte erstellt.

Verwandte Themen