Frage

Ich muss eine große Datenmenge (ca. 2 GB) kleiner Objekte in eine einzige Datei serialisieren, um sie später von einem anderen Java-Prozess verarbeiten zu können.Leistung ist irgendwie wichtig.Kann jemand eine gute Methode vorschlagen, um dies zu erreichen?

War es hilfreich?

Lösung

Haben Sie einen Blick auf Googles genommen Protokollpuffer ? Klingt wie ein Anwendungsfall für sie.

Andere Tipps

Ich weiß nicht, warum Java Serialisierung nach unten gestimmt hätte, es ist ein vollkommen funktionsfähiger Mechanismus.

Es ist nicht klar von der ursprünglichen Post, sondern alle 2G von Daten im Heap zur gleichen Zeit? Oder Dumping Sie etwas anderes?

Aus dem Kasten heraus, Serialisierung ist nicht die „perfekte“ Lösung, aber wenn Sie Externalizable auf Ihre Objekte implementieren, können Serialisierung gut funktionieren. Serialisierungen großer Aufwand ist, herauszufinden, was zu schreiben und wie sie zu schreiben. Durch die Implementierung von Externalizable, nehmen Sie diese Entscheidungen aus der Hand, so dass durchaus eine Leistungssteigerung zu gewinnen und eine Platzersparnis.

Während I / O ein primär Kosten für das Schreiben große Datenmengen ist, die Nebenkosten, die Daten der Umwandlung können auch sehr teuer sein. Zum Beispiel mögen Sie nicht alle Ihre Zahlen umwandeln wieder in Text und dann besser, sie in einem nativen Format, wenn möglich, zu speichern. ObjectStream hat Methoden, um die native Typen in Java lesen / schreiben.

Wenn Sie alle Ihre Daten ausgelegt ist, um eine einzelne Struktur geladen zu werden, können Sie einfach tun ObjectOutputStream.writeObject (yourBigDatastructure), nachdem Sie Externalizable implementiert haben.

Sie können jedoch auch Ihre Struktur iterieren und rufen write auf die einzelnen Objekte.

So oder so, wirst du einige „objectToFile“ Routine müssen, vielleicht mehrere. Und das ist effektiv, was Externalizable bietet, sowie ein Rahmen Ihre Struktur zu gehen.

Die andere Frage ist natürlich, ist die Versionierung usw. Aber da Sie alle die Serialisierung implementieren Routinen einfach selbst, haben Sie die volle Kontrolle über das auch.

Ein einfachste Ansatz sofort zu meinem Verstand kommt mit Memory-Mapped-Puffer von NIO (java.nio.MappedByteBuffer). Verwenden Sie die einzelnen Puffer (ungefähr) entsprechend der Größe eines Objekts und flush / append sie in die Ausgabedatei, wenn notwendig. Memory-Mapped-Puffer sind sehr effecient.

Haben Sie versucht, Java Serialisierung? Sie würden sie schreiben eine Object und lesen ‚em in mit einem Object . Natürlich würden die Klassen sein müssen Serializable . Es wäre die geringe Aufwand Lösung und, da die Objekte in binär gespeichert werden, wäre es kompakt und schnell sein.

Wenn die Leistung sehr importiert dann müssen Sie es selbst schreiben. Sie sollten ein kompaktes Binärformat verwenden. Denn mit 2 GB der Festplatten-E / A-Operation ist sehr wichtig. Wenn Sie irgendeine Menschen lesbare Formate wie XML oder andere Skripte verwenden, die Größe, um die Daten mit einem Faktor von 2 oder mehr.

auf den Daten Je kann es beschleunigen, wenn Sie die Daten im laufenden Betrieb mit einer niedrigen Kompressionsrate komprimiert werden.

Insgesamt no go ist Java Serialisierung weil auf auf jedem Objekt Java-Check zu lesen, wenn es ein Verweis auf ein vorhandenes Objekt ist.

I entwickelt JOAFIP als Datenbank Alternative.

Apache Avro könnte auch nützlich sein. Es wurde entwickelt, Sprache, unabhängig zu sein und hat Bindungen für die beliebten Sprachen .

Überprüfen Sie es heraus.

Protokollpuffer:macht Sinn.Hier ist ein Auszug aus ihrem Wiki: http://code.google.com/apis/protocolbuffers/docs/javatutorial.html

Mehr Geschwindigkeit erreichen

Standardmäßig versucht der Protokollpuffer-Compiler, kleinere Dateien zu generieren, indem er Reflektion verwendet, um die meisten Funktionen zu implementieren (z. B.Parsing und Serialisierung).Der Compiler kann jedoch auch explizit für Ihre Nachrichtentypen optimierten Code generieren, was häufig zu einer Leistungssteigerung um ein Vielfaches führt, aber auch zu einer Verdoppelung der Codegröße.Wenn die Profilerstellung zeigt, dass Ihre Anwendung viel Zeit in der Protokollpufferbibliothek verbringt, sollten Sie versuchen, den Optimierungsmodus zu ändern.Fügen Sie einfach die folgende Zeile zu Ihrer .proto-Datei hinzu:

optionoptimize_for = SPEED;

Führen Sie den Protokoll-Compiler erneut aus und er generiert extrem schnelles Parsen, Serialisieren und anderen Code.

Sie sollten wahrscheinlich eine Datenbanklösung betrachten - alle Datenbanken zu tun ist, ihre Informationen zu optimieren, und wenn Sie Hibernate verwenden, halten Sie Ihr Objektmodell wie und nicht wirklich selbst über Ihre DB denken (ich glaube, das ist, warum es heißt hibernate, nur speichern sie Ihre Daten aus, dann bringen)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top