Was sind meine Optionen riesige Mengen an Daten zu speichern und abfragen, wo eine Menge davon zu wiederholen wird?

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

Frage

I Optionen für effiziente Datenspeicherung in Java ist auswertet. Der Datensatz sind zeitgestempelt Datenwerte mit einem benannten Primärschlüssel. z.

Name: A|B|C:D
Value: 124
TimeStamp: 01/06/2009 08:24:39,223

Könnte ein Aktienkurs zu einem bestimmten Zeitpunkt sein, so ist es, ich nehme an, eine Reihe Datenmuster klassische Zeit. Ich brauche aber wirklich eine generische RDBMS-Lösung, die mit jeder vernünftigen JDBC kompatible Datenbank arbeiten, wie ich Hibernate verwenden möchte. Folglich Zeitreihen Erweiterungen Datenbanken wie Oracle sind nicht wirklich eine Option, wie ich die Implementierer ihre eigenen JDBC zu können, verwenden möchte / Hibernate fähige Datenbank.

Die Herausforderung hier ist einfach das massive Volumen an Daten, die in kurzer Zeit ansammeln können. Bisher sind meine Implementierungen um die Definition periodische Rollup und Säuberung Pläne konzentriert, in denen Rohdaten in DAY aggregiert, Woche, Monat usw. Tische, aber der Nachteil ist der frühe Verlust der Granularität und die kleine Unbequemlichkeit der Periode Mismatches zwischen den Perioden in verschiedenen gespeicherten Aggregate.

Die Herausforderung Optionen hat begrenzt, da es eine absolute Grenze ist, wie viele Daten physikalisch komprimiert werden, während die ursprüngliche Granularität der Daten beibehalten wird, und diese Grenze durch die Richtlinie der Verwendung einer relationalen Datenbank noch verschärft wird, und eine generische JDBC-fähig an dem.

ein fiktives Konzept von klassischen Datenkompressionsalgorithmen Leihen und nutzt die Tatsache, dass viele aufeinander folgende Werte für den gleichnamigen Schlüssel erwartet identisch zu sein, ich frage mich, ob es so, wie ich nahtlos die Anzahl der gespeicherten Datensätze reduzieren kann durch conflating Wiederholen der Werte in einer logischen Zeile während auch einen Zähler zu speichern, die effektiv „die nächste n Datensätze haben den gleichen Wert“ anzeigt. Die Umsetzung scheint nur, dass einfach genug, aber der Kompromiss ist, dass das Datenmodell jetzt kompliziert ist fürchterlich gegen die Verwendung von Standard-SQL abzufragen, vor allem, wenn jede Art von Aggregate SQL-Funktionen. Dies reduziert deutlich den Nutzen des Datenspeichers, da nur komplexen benutzerdefinierten Code kann die Daten zurück zu einem „dekomprimiert“ Zustand, was zu einer Impedance Mismatch mit Hunderten von Tool wiederherstellen, die diese Daten zu machen, richtig nicht in der Lage sein.

als ich die Möglichkeit, benutzerdefinierte Hibernate Typen definieren, die im Grunde die komprimierten Daten gesetzt „verstehen“ würde und es Schlag zurück und Abfrageergebnisse mit den dynamisch erzeugten synthetischen Zeilen zurück. (Die Datenbank wird nur an alle Clients mit Ausnahme des streng kontrollierten Eingangsstrom gelesen werden). Einige der Werkzeuge, die ich im Sinn hatte, wird mit Hibernate / POJOs neben rohen JDBC (zB. Jasper) integrieren Aber das geht nicht wirklich die Aggregatfunktionen Problem und hat wahrscheinlich eine Reihe von anderen Fragen auch.

So bin ich teilweise selbst möglicherweise zu seinem Rücktritt zu, die ein proprietären zu verwenden [möglicherweise Nicht-SQL] Datenspeicher (Anregungen geschätzt) und dann konzentrieren sich auf der möglicherweise weniger komplexen Aufgabe, einen Pseudo-JDBC-Treiber mindestens Schreiben erleichtert die Integration mit externen Tool.

Ich habe gehört, Bezug auf einen so genannten „ Bit gepackte Datei “ als ein Mechanismus, um diese Datenkompression zu erreichen, aber ich weiß nicht von irgendwelchen Datenbanken, die dies und das letzte, was liefern will ich tun (oder tun kann, wirklich ....) ist meine eigene Datenbank schreiben.

Haben Sie Vorschläge oder Einsicht?

War es hilfreich?

Lösung

Ich würde bei einer Spalte orientierte Datenbank Oriented . Es wäre für diese Art der Anwendung groß sein

Andere Tipps

Ruhezustand (oder eine JPA-Lösung) ist das falsche Werkzeug für diesen Job.

JPA / Hibernate ist keine leichte Lösung. In hochvolumigen Anwendungen ist der Aufwand nicht nur signifikant, aber unerschwinglich. Sie müssen wirklich in Persistenz als Service Modell (ironischerweise über Hibernate geschrieben, aber es gilt für alles).

Im Wesentlichen bedeutet dies, Ihr Datum speichern Hits sind asynchron und es funktioniert gut mit Zusammenfassungsdaten zu tun. Wie Sie einen Dienst zu hören für den Handel Benachrichtigungen haben können und bleiben nur die, die es ist interessiert an (im Speicher Aggregieren falls erforderlich). Sie können auf diese Weise offen / hoch / niedrig / Preise zum tun.

Für hochvolumige Daten, die Sie nicht wirklich wollen, sie alle in die Datenbank zu schreiben.Nicht synchron sowieso. Ein persistenter Speicher und ein Data Warehouse ist wahrscheinlich der Weg Sie gehen wollen aber auch hier hängt dies von Anforderungen, Volumen, etc.

Es ist ein kompliziertes Thema und ich habe touche es nur wirklich don. Hoffe, das hilft dir.

Sie werden wahrscheinlich finden es interessant Michael Stonebraker Präsentation auf Geld zu hören: Tech . Er trifft auf eine Reihe der Dinge, die Sie erwähnen brauchen, und er zeigt, wie die drei großen Elefanten (SQL Server, Oracle und DB2) nie auf die Bedürfnisse der Zecke speichert Hotel der Lage sein (was es sieht aus wie Sie bauen). Er gräbt jenseits Spalte speichert, die ich stimme die richtige Richtung. Er bespricht auch Kompression und Geschwindigkeit, die für Sie beide Fragen sind.

Hier sind einige weitere Links können Sie interessant finden:

Viele JDBC-fähige Datenbank-Management-Systeme (zum Beispiel Oracle) bieten Kompression im physischen Speicher-Engine. Oracle, zum Beispiel, hat den Begriff einer „komprimiert“ Tabelle ohne Dekompression Kopf:

http: //www.ardentperf .com / wp-content / uploads / 2007/07 / advanced-kompressions Datasheet.pdf

Danke für die Antworten.

Cletus, schätze ich die Umrisse, aber eine der Vor- und Nachteile kann ich nicht DB Flexibilität und Kompatibilität mit JDBC / Hibernate zu ermöglichen, die Nutzung aller verfügbaren Tools machen aufgibt. Darüber hinaus, obwohl ich nicht eindeutig diesem Zustand habe, möchte ich nicht meine Nutzer in zwingen, eine [möglicherweise teuer] kommerzielle Lösung gewählt. Wenn sie Database Brand X haben, lassen Sie sie es verwenden. Wenn sie sich nicht, empfehlen wir Open-Source-Datenbank Marke Y. Grundsätzlich ist die Anwendung hat mehrere Gesichter, eines davon ein Repository für eingehende Daten zu sein, aber ein anderes Gesicht ist eine Reporting-Quelle und I wirklich don ‚t will in das Geschäft Generatoren des Schreibens Bericht erhalten.

Während ich nicht wirklich haben Last, die es noch nicht getestet, ich bin sehr beeindruckt von LucidDB . Es ist eine Spalte orientierte Datenbank und es bietet eine gute Abfrageleistung und scheinbar gute Datenkompression. Es verfügt über einen JDBC-Treiber, obwohl kein Hibernate Dialekt für sie existiert noch, soweit ich das beurteilen kann. Es unterstützt auch benutzerdefinierte Transformationen, die kurz gesagt, ich denke, wird mir erlauben, meine Idee umzusetzen Komprimieren nahtlos zu wiederholen und aufeinanderfolgende Werte in einer „Reihe“, sondern blasen sie in wieder aus mehreren „synthetischen“ Zeilen zum Zeitpunkt der Abfrage, alles getan, was unsichtbar auf die Abfrage Anrufer. Schließlich unterstützt es diese nette Funktion von fremden Tabellen, in denen anderen JDBC-Unterstützung von Datenbanktabellen können in LucidDB konfrontiert werden. Ich denke, das von unschätzbarem Wert sein kann ein gewisses Maß an Unterstützung für andere Datenbanken zu bieten.

Danke für den Zeiger, Javaman. Es Zonen aufgeteilt mich in auf LucidDB.

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