Frage

Ich benötige eine festplattengestützte Kartenstruktur zur Verwendung in einer Java-App.Es muss folgende Kriterien erfüllen:

  1. Kann Millionen (sogar Milliarden) Datensätze speichern
  2. Schnelle Suche – die meisten Vorgänge auf der Karte dienen lediglich dazu, festzustellen, ob bereits ein Schlüssel vorhanden ist.Dies und 1 oben sind die wichtigsten Kriterien.Für häufig verwendete Schlüssel sollte ein wirksamer Cache-Mechanismus im Speicher vorhanden sein.
  3. Dauerhaft, muss aber nicht transaktional sein, kann mit einigen Fehlern leben.d.h.Synchronisiert sich gerne regelmäßig mit der Festplatte und muss nicht transaktional sein.
  4. Kann einfache primitive Typen speichern – aber ich muss keine serialisierten Objekte speichern.
  5. Es muss nicht verteilt werden, d.h.läuft alles auf einer Maschine.
  6. Einfach einzurichten und kostenlos zu verwenden.
  7. Keine relationalen Abfragen erforderlich

Datensatzschlüssel sind Strings oder Longs.Wie oben beschrieben, werden Lesevorgänge viel häufiger vorkommen als Schreibvorgänge, und die meisten Lesevorgänge dienen lediglich der Überprüfung, ob ein Schlüssel vorhanden ist (d. h.Die mit den Schlüsseln verbundenen Daten müssen nicht gelesen werden.Jeder Datensatz wird nur einmal aktualisiert und Datensätze werden nicht gelöscht.

Ich verwende derzeit Bdb JE, suche aber nach anderen Optionen.


Aktualisieren

Seitdem habe ich die Abfrageleistung meines bestehenden BDB-Setups verbessert, indem ich die Abhängigkeit von Sekundärschlüsseln reduziert habe.Einige Abfragen erforderten eine Verknüpfung zweier Sekundärschlüssel, und durch die Kombination dieser Schlüssel zu einem zusammengesetzten Schlüssel habe ich eine Indirektionsebene bei der Suche entfernt, was die Arbeit deutlich beschleunigt.

War es hilfreich?

Lösung

Ich würde wahrscheinlich eine lokale Datenbank verwenden.Wie gesagt Bdb JE oder HSQLDB.Darf ich fragen, was an diesem Ansatz falsch ist?Sie müssen einen Grund haben, nach Alternativen zu suchen.

Als Antwort auf Kommentare:Aufgrund der problematischen Leistung und ich vermute, dass Sie bereits JDBC verwenden, um damit umzugehen, könnte es sich lohnen, HSQLB auszuprobieren und das Kapitel darüber zu lesen Speicher- und Festplattennutzung.

Andere Tipps

JDBM3 macht genau das, was Sie suchen.Es handelt sich um eine Bibliothek festplattengestützter Karten mit wirklich einfacher API und hoher Leistung.

AKTUALISIEREN

Dieses Projekt hat sich nun zu MapDB entwickelt http://www.mapdb.org

Vielleicht möchten Sie einen Blick darauf werfen OrientDB.

Sie können Java Chronicles unter ausprobieren http://openhft.net/products/chronicle-map/Chronicle Map ist ein hochleistungsfähiger, persistenter Off-Heap-Schlüsselwert-Datenspeicher im Arbeitsspeicher.Es funktioniert wie eine Standard-Java-Karte

Ab heute würde ich entweder verwenden MapDB (dateibasierte/gestützte Synchronisierung oder Asynchronisierung) oder Hazelcast.Später müssen Sie Ihre eigene Persistenz implementieren, d. h.unterstützt durch ein RDBMS durch Implementierung einer Java-Schnittstelle. OpenHFT Chronik könnte eine andere Option sein.Ich bin mir nicht sicher, wie Persistenz dort funktioniert, da ich sie nie verwendet habe, aber ich behaupte, dass ich eine habe.OpenHFT ist vollständig Off-Heap und ermöglicht teilweise Aktualisierungen von Objekten (von Grundelementen) ohne (De-)Serialisierung, was einen Leistungsvorteil darstellen könnte.

NOTIZ:Wenn Sie Ihre Kartenfestplatte aufgrund von Speicherproblemen benötigen, ist MapDB die einfachste Option.Hazelcast kann als Cache (verteilt oder nicht) verwendet werden, der es Ihnen ermöglicht, Elemente nach Zeit oder Größe aus dem Heap zu entfernen.OpenHFT ist Off-Heap und könnte in Betracht gezogen werden, wenn Sie nur Persistenz für JVM-Neustarts benötigen.

Ich habe gefunden Kabinett Tokio Es soll ein einfacher persistenter Hash/Map sein, der schnell einzurichten und zu verwenden ist.

Dieses gekürzte Beispiel stammt aus die Dokumente, zeigt, wie einfach es ist, Daten aus einer persistenten Karte zu speichern und abzurufen:

    // create the object
    HDB hdb = new HDB();
    // open the database
    hdb.open("casket.tch", HDB.OWRITER | HDB.OCREAT);
    // add item 
    hdb.put("foo", "hop");
    hdb.close();

SQLite macht das.Ich habe einen Wrapper für die Verwendung aus Java geschrieben: http://zentus.com/sqlitejdbc

Wie ich in einem Kommentar erwähnt habe, habe ich SQLite erfolgreich mit Gigabytes an Daten und Tabellen mit Hunderten Millionen Zeilen verwendet.Wenn Sie die Indizierung richtig überdenken, geht es sehr schnell.

Das einzige Problem ist die JDBC-Schnittstelle.Im Vergleich zu einer einfachen HashMap ist es klobig.Am Ende schreibe ich oft einen JDBC-Wrapper für das spezifische Projekt, was zu einer Menge Boilerplate-Code führen kann.

JBoss (Baum)-Cache ist eine tolle Option.Sie können es eigenständig von JBoss aus verwenden.Sehr robust, leistungsstark und flexibel.

Ich finde Scherben in den Ruhezustand versetzen kann problemlos alle Ihre Anforderungen erfüllen.

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