Welche einfache Datenspeicherungsoption für große Mengen nicht relationaler Daten

Ich suche nach einer guten Lösung zum Speichern und Abrufen einer großen Menge (sagen wir ein paar hundert Millionen oder sogar bis zu einer Milliarde) von Datenelementen, die hauptsächlich aus Zeichenfolgen (aber auch ein paar numerischen Feldern) bestehen, auf/von einer Festplatte Java-Server-Anwendung. Die Anzahl der Datenfelder auf den Items ist nicht festgelegt, so enthält beispielsweise das entsprechende Java-Objekt Sammlungen (Set,Map,List) von Strings. Ich rufe die Daten aus einer externen Quelle ab und verarbeite sie in meiner Anwendung vor und brauche eine Möglichkeit, sie im vorverarbeiteten Format zu speichern. Später muss ich in der Lage sein, die relevanten Teile der Daten so schnell wie möglich in den Speicher zu laden. Es gibt auch einige Prozesse, bei denen die Daten weiter modifiziert werden. In diesem Fall muss ich ausgewählte Felder vieler / aller Elemente aktualisieren, aber das passiert nicht sehr häufig.

Meine Anforderungen sind:

  • Zuordnung zwischen Java-Objekten und persistenten Daten (Dies ändert sich nicht häufig, wenn es also etwas Arbeit erfordert, ist das in Ordnung)
  • Schnelle Serialisierung / Schreiben auf Festplatte, die auch in Stapeln funktioniert. Ich bin nicht in der Lage, alle Elemente im Speicher zu halten, also muss ich sie in Stapeln beibehalten, dh in der Lage sein, neue Elemente zu den vorhandenen hinzuzufügen.
  • Schnelles Auffinden einzelner Artikel (nach ID) und auch für viele/alle Artikel. Ich denke, ich könnte einen Index der Element-IDs für die von mir benötigten Abfragen im Speicher halten, daher wäre es in Ordnung, wenn der Speicher ein einfacher Schlüsselwertspeicher ohne Suchfunktion wäre. In einem anderen Szenario wird ein Lucene-Index der Elemente verwendet und der Index zuerst für die Textsuche abgefragt und dann die Elemente aus der Speicherlösung abgerufen.
  • Transaktionshandhabung: Ich brauche eine sichere Methode, um die Lese-/Schreibvorgänge für den gleichzeitigen Zugriff zu schützen, und ich muss in der Lage sein, Änderungen in einer Transaktion anzuwenden, sodass alle Änderungen rückgängig gemacht werden, wenn etwas schief geht.
  • Einfache Bereitstellung, ich würde einen dateibasierten Ansatz bevorzugen, bei dem keine externe Datenbank usw. gestartet werden muss. Meine Anwendung wird auf einem einzelnen Computer ausgeführt, daher suche ich keinen verteilten Datenspeicher, der viel Infrastruktur erfordert.
  • Muss kostenlos / Open Source sein. Die Lizenz muss die Nutzung des Speichers auch in kommerziellen Anwendungen erlauben.

Bisher habe ich versucht:

1) Alle Elemente mit Jackson in eine einzige JSON-Datei schreiben: Dies macht das Lesen/Schreiben ausreichend schnell, aber offensichtlich gibt es keine einfache Möglichkeit, einzelne Elemente abzurufen oder zu den vorhandenen hinzuzufügen. Auch gibt es keine Transaktionsunterstützung etc.

2) Ruhezustand mit HSQLDB im Dateimodus: Dies erleichtert die Objektzuordnung, Bereitstellung und Transaktionshandhabung, aber die Einfüge-/Ladeleistung ist sehr schlecht, wenn viele Objekte eingefügt/geladen werden (x10 langsamer als der Json-Ansatz). Ich bin immer noch etwas überrascht, dass das Lesen/Schreiben so langsam ist. Zuerst habe ich einige @ElementCollections / Merge-Tabellen für die Sammlungstypen innerhalb der Elemente verwendet, was noch langsamer schien, später habe ich die Sammlungen in json serialisiert und in einer varchar-Spalte gespeichert, was die Leistung verbessert hat, aber immer noch langsam ist. Ich bin mir nicht sicher, ob SQL hier der richtige Ansatz ist, da ich nicht wirklich eine feste Anzahl von Spalten habe und keine Beziehungen zwischen Elementen benötige.

Irgendwelche Empfehlungen ?

Möchten Sie Cloud-basierte Lösungen wie Firebase in Betracht ziehen?
Nein, das glaube ich nicht, ich würde eine Einrichtungs-/Verwaltungslösung ohne Setup bevorzugen, so dass alles, was benötigt wird, aus dem Anwendungscode heraus erledigt werden kann, wie zum Beispiel mit dateibasiertem hsqldb

Antworten (2)

Dafür würde ich ernsthaft erwägen, mongodb zu verwenden, obwohl Sie dies auf einem einzelnen Computer für den lokalen Zugriff sagen. Zusätzlich zu Ihren Anforderungen möchten Sie wahrscheinlich über eine einfache Sicherung usw. nachdenken. - Ich würde es hassen, ein paar tausend Datensätze zu verlieren, geschweige denn Hunderttausende oder Millionen ....

Es ist nosql. Es hat Java-Treiber/Konnektoren. Es funktioniert mit JSON-Datenstrukturen beim Abfragen oder Einfügen/Aktualisieren. Zum schnellen Abrufen einzelner Elemente können Sie "only first return" angeben, damit es, nachdem es gefunden wurde, nicht weiter nach anderen sucht, es kostenlos und offen ist und mit einem "apt-get install mongodb" unter Debian/Ubuntu installiert wird , es trifft so ziemlich alle Ihre Punkte.

Danke werde ich versuchen. Eine Sache, die mich jedoch stört, ist, dass mongodb als separater Prozess gestartet werden muss, oder?
@nonameyet - es ist ein Daemon-Prozess, also ja, er muss irgendwann gestartet werden.

Postgres

Wenn Sie Ihr Objekt als JSON darstellen können, sollten Sie die Verwendung von Postgres und seinem jsonbDatentyp („JSON-Binär“) in Betracht ziehen .

Dieser Typ akzeptiert Ihre JSON-Eingabe und analysiert sie dann, um dieses JSON-Dokument in seinem eigenen internen Binärformat darzustellen. Dieses spezielle Format ermöglicht es Postgres, von Ihnen angegebene Elemente zu indizieren.

Sie erhalten also die Flexibilität halbstrukturierter Daten, wie sie in den „NoSQL“-Produkten zu sehen sind. Außerdem erhalten Sie die schnelle Indizierung und die ACID -konforme Datensicherheit einer relationalen Datenbank in Unternehmensqualität.

Danke werde ich versuchen. Eine Sache, die mich jedoch stört, ist, dass Postgres als separater Prozess gestartet werden muss, oder?
@nonameyet Ja, Postgres läuft unabhängig in separaten Betriebssystemprozessen. Der „Postmaster“-Prozess lauscht auf eingehende Verbindungen und erzeugt einen OS-Prozess, um diese abgeschlossene Verbindung zu bedienen. Sobald diese Verbindung geschlossen wird, endet der Prozess. Diese Architektur kann sich in Zukunft ändern, gilt aber ab Postgres 10.