Hallo,
ich versuche gerade eine art Container für große Datenmengen zu erstellen und dabei auf relationale Datenbanken zu verzichten. Die Datenstruktur ist vereinfacht als List<List> bzw. List<DataRow> zu verstehen, wobei diese weder in der Anzahl der Spalten noch der Zeilen festgelegt, bzw. beschränkt ist. Da die Datenmenge sehr groß (größer als der RAM) werden kann, müssen die Daten gesplittet werden ( Pages=Chunks !?).
Jede DataRow hat einen key (externer identifier) und vermutlich am Besten auch eine ID, sowie die Daten (Spaltenwerte) in einer Liste.
Der Hauptfokus liegt hierbei auf dem Einfügen, dem Suchen und dem Durchlauf durch die Daten. Updates sind erst einmal unwichtig.
Überlegungen:
a) Implementierung des Collection-Interface
b) Iterationsmöglichkeit
c) Backend für die Chunks als Serialized-Files oder in Objekdatenbank db4o.
d) Gleichzeitig interessiert mich die Performance im Vergleich zwischen Serialisierung und der Objektdatenbank beim Speichern, Suchen, Durchlaufen; Ich möchte die Geschwindigkeit optimieren, daher würde ich auf das Trove-Paket zurückgreifen
e) Trennung von Daten und Index -> B+ Baum
Fragen:
1) Das Collection-Interface greift auf int als Indexwerte zurück. Wenn ich aber von "großen" Mengen spreche, wäre dann nicht long besser? long macht aber viele Probleme.
2) Der Index wird bei long-Werten irgendwann auch zu groß für den Speicher. Wie kann ich den aufteilen bzw. möglichst klein halten?
3) Bisher bin ich davon ausgegangen, dass ich die keys als Indexschlüssel in dem B-Baum verwalte, der dann auf den jeweiligen Chunk bzw. die DataRow in dem Chunk verweist.
3a) Wie gehe ich denn mit evtl. doppelten Einträgen vor? Im prinzip müsste der User die keys vergeben.
3b) Nehme ich aber key und id, dann ist die Frage wie ich die ID vergebe: ID=key? und was mache ich bei belegter ID?
3c) Sollte ich doppelte Schlüssel erlauben? Gäbe das nicht ziemliche Probleme beim suchen bzw. balancieren des Baums!?
4) Wenn der Benutzer für den key einer DataRow andere Werte als int oder long nutzen möchte, müsste ich vermutlich auf String als allgemeinen Typ zurückgreifen. Wie aber nutze ich den als Index? Bzw. wenn ich eine interne ID mit long oder int benutze, wie vergebe ich dann die id? (so eine Art Auto-Increment?). Wie finde ich dann Daten per key, ohne die ganze Datenbank zu durchlaufen? Brauche ich dann noch einen weiteren kompletten Index?
5) Macht es Sinn mehrere Chunks im Speicher zu halten? So eine Art Last-Used-Liste, um zu verhindern, dass immer wieder Chunks gespeichert/geladen werden müssen, die gerader erst gebraucht wurden.
6) Wie erstelle ich einen Iterator für die Collection? Wie verhindere ich, dass dabei zu inkonsistenzen bei Chunks kommt?
So, dass wären die Hauptfragen...
Ich habe schon erste Interfaces deklariert und einige Methoden, aber das wird recht groß, daher verzichte ich hier erst einmal auf das posten.
Hoffe Ihr könnt mir ein wenig helfen...
Gruß
Ralf
ich versuche gerade eine art Container für große Datenmengen zu erstellen und dabei auf relationale Datenbanken zu verzichten. Die Datenstruktur ist vereinfacht als List<List> bzw. List<DataRow> zu verstehen, wobei diese weder in der Anzahl der Spalten noch der Zeilen festgelegt, bzw. beschränkt ist. Da die Datenmenge sehr groß (größer als der RAM) werden kann, müssen die Daten gesplittet werden ( Pages=Chunks !?).
Jede DataRow hat einen key (externer identifier) und vermutlich am Besten auch eine ID, sowie die Daten (Spaltenwerte) in einer Liste.
Der Hauptfokus liegt hierbei auf dem Einfügen, dem Suchen und dem Durchlauf durch die Daten. Updates sind erst einmal unwichtig.
Überlegungen:
a) Implementierung des Collection-Interface
b) Iterationsmöglichkeit
c) Backend für die Chunks als Serialized-Files oder in Objekdatenbank db4o.
d) Gleichzeitig interessiert mich die Performance im Vergleich zwischen Serialisierung und der Objektdatenbank beim Speichern, Suchen, Durchlaufen; Ich möchte die Geschwindigkeit optimieren, daher würde ich auf das Trove-Paket zurückgreifen
e) Trennung von Daten und Index -> B+ Baum
Fragen:
1) Das Collection-Interface greift auf int als Indexwerte zurück. Wenn ich aber von "großen" Mengen spreche, wäre dann nicht long besser? long macht aber viele Probleme.
2) Der Index wird bei long-Werten irgendwann auch zu groß für den Speicher. Wie kann ich den aufteilen bzw. möglichst klein halten?
3) Bisher bin ich davon ausgegangen, dass ich die keys als Indexschlüssel in dem B-Baum verwalte, der dann auf den jeweiligen Chunk bzw. die DataRow in dem Chunk verweist.
3a) Wie gehe ich denn mit evtl. doppelten Einträgen vor? Im prinzip müsste der User die keys vergeben.
3b) Nehme ich aber key und id, dann ist die Frage wie ich die ID vergebe: ID=key? und was mache ich bei belegter ID?
3c) Sollte ich doppelte Schlüssel erlauben? Gäbe das nicht ziemliche Probleme beim suchen bzw. balancieren des Baums!?
4) Wenn der Benutzer für den key einer DataRow andere Werte als int oder long nutzen möchte, müsste ich vermutlich auf String als allgemeinen Typ zurückgreifen. Wie aber nutze ich den als Index? Bzw. wenn ich eine interne ID mit long oder int benutze, wie vergebe ich dann die id? (so eine Art Auto-Increment?). Wie finde ich dann Daten per key, ohne die ganze Datenbank zu durchlaufen? Brauche ich dann noch einen weiteren kompletten Index?
5) Macht es Sinn mehrere Chunks im Speicher zu halten? So eine Art Last-Used-Liste, um zu verhindern, dass immer wieder Chunks gespeichert/geladen werden müssen, die gerader erst gebraucht wurden.
6) Wie erstelle ich einen Iterator für die Collection? Wie verhindere ich, dass dabei zu inkonsistenzen bei Chunks kommt?
So, dass wären die Hauptfragen...
Ich habe schon erste Interfaces deklariert und einige Methoden, aber das wird recht groß, daher verzichte ich hier erst einmal auf das posten.
Hoffe Ihr könnt mir ein wenig helfen...
Gruß
Ralf