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:
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 ?
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.
Wenn Sie Ihr Objekt als JSON darstellen können, sollten Sie die Verwendung von Postgres und seinem jsonb
Datentyp („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.
Jon Scott
Benutzer34719