Wie effizient wird eine In-Memory-Datenbank verwenden Millionen von temporären Werten zu speichern?

StackOverflow https://stackoverflow.com/questions/3936044

Frage

Meine Anwendung speichert derzeit Millionen von Double Elemente für eine Berechnung. Diese Werte sind nur temporäre Werte, bevor sie für einen bestimmten Algorithmus verwendet werden, die am Ende der Berechnung ausgeführt wird. Sobald diese Berechnung abgeschlossen ist, können die Millionen von Werten verworfen werden.

Die ganze Geschichte ist hier , wenn Sie benötigen weitere Informationen.

Eine der Lösungen, die vorgeschlagen wurde, ist eine In-Memory-Datenbank zu verwenden.

Also, wenn ich mit dieser Lösung gehen, werde ich diese Datenbank verwenden, um meine Werte in einer Tabelle speichern meine aktuellen Map<String, List<Double>> zu ersetzen, wie:

create table CALCULATION_RESULTS_XXX (
  deal_id varchar2,
  values number
);

(eine Tabelle pro Berechnung, XXX ist die Berechnung ID)

So bei der Berechnung, werde ich die folgenden Schritte ausführen:

  1. Wenn die Berechnung gestartet wird, ich die CALCULATION_RESULTS_XXX Tabelle erstellen.
  2. Jedes Mal, wenn ich brauche einen Wert hinzuzufügen, füge ich einen Datensatz in dieser Tabelle.
  3. Am Ende der Berechnung verwende ich den Tabelleninhalt für meinen Algorithmus.
  4. Schließlich habe ich diese Tabelle fallen.

erklärt wie in dem anderen Thema , zur Zeit, meine Berechnung speichern kann mehr hundert MB Daten im Speicher, als eine Liste von 30 * 1.000.000 von Double wird über 240MB benötigen.

Die Fragen nun:

  1. Wenn ich mit einem In-Memory-Datenbank gehen, tut mein Gedächtnis consomption wird verringert werden?
  2. Was die spezifischen Punkte sind, dass ich darauf achten, in Bezug auf die Datenbanknutzung (oder das Erstellen von Tabellen), die Dateneinfügung usw.?
  3. Ich denke, ich werde wählen H2 Datenbank . Glaubst du, es ist die beste Wahl für meine Bedürfnisse?
War es hilfreich?

Lösung

Das Problem einfach genug ist, dass man wirklich nur brauchen, um es zu gehen und sehen, wie die (Performance) Ergebnisse erarbeiten.

Sie haben bereits eine Implementierung, die nur einfache In-Memory-Strukturen verwendet. Persönlich gegeben, dass selbst der billigste Computer von Dell mit 1 GB + RAM kommt, könnte man genauso gut mit dem Stick. Davon abgesehen, sollte es recht einfach sein, in einer Datenbank oder zwei Wack. Ich würde betrachten Sleepycat Berkerly DB (die jetzt von Oracle gehört ...), da Sie SQL brauchen nicht zu verwenden und sie sollten recht effizient sein. (Sie unterstützen Java).

Wenn die Ergebnisse sind viel versprechend, würde ich dann eine weitere Untersuchung prüfen, aber das ist wirklich nur ein paar Tage Arbeit nehmen, höchstens, einschließlich des Benchmarking.

Andere Tipps

Ein einfaches HashMap gesichert von Terracotta besser tun würde, und wird zu speichern Sammlung größer dann den virtuellen Speicher JVM ermöglichen.

Embedded-Datenbanken, insbesondere die SQL-basiert ist, werden Komplexität und Aufwand, um Ihren Code, so dass es nicht wert, es tut. Wenn Sie wirklich eine persistente Speicherung mit Direktzugriff benötigen, versuchen Sie eine von NoSQL DBs, wie CouchDB , Cassandra , Neo4j

Ich weiß nicht, ob es schneller sein, so dass Sie es versuchen müßten. Was ich tun möchte, ist empfehlen, Batch-Einsätze einer ganzen Liste tun, wenn Sie nicht sofort mehr diese Liste müssen. Nicht speichern Wert von Wert:)

Wenn Sie Ende Algorithmus kann in SQL ausgedrückt werden könnte es auch lohnt sich, das zu tun, und laden nicht alle Listen zurück in. Auf jeden Fall nicht setzen etwas wie ein Index oder Beschränkung auf den Werten und vorzugsweise erlaubt auch nicht NULL (wenn möglich). Die Aufrechterhaltung Indizes und Constraints Kosten Zeit und die NULL zulassen kann auch Zeit kosten, oder über Kopf erstellen. deal_ids können (und sind) natürlich wie sie sind Primärschlüssel indiziert.

Das ist nicht sehr viel, aber zumindest besser als eine einzige nach unten gestimmt Antwort:)

Es gibt wirklich keinen Grund, überhaupt eine externe Komponente hinzufügen, um Ihren Programmlauf langsamer zu machen. Komprimieren den Datenblock und schreiben Sie es auf Datei, wenn Sie mehr als der interne Speicher zur Verfügung müssen zu handhaben. Eine Workstation jetzt 192 GB RAM nimmt, so dass Sie nicht viel Zeit zu verschwenden es sich leisten können.

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