Ich muss bis zu Dutzende oder sogar Hunderte von Millionen von Daten auf der Festplatte speichern. Jedes Stück Daten enthält Informationen wie:Wie behalte ich Daten auf der Festplatte, und beide aktualisieren sie zufällig und streamen sie effizient zurück in den Arbeitsspeicher?
id=23425
browser=firefox
ip-address=10.1.1.1
outcome=1.0
Neue Stücke von Daten können mit einer Geschwindigkeit von bis zu 1 pro Millisekunde hinzugefügt werden.
Also eine relativ einfache Gruppe von Schlüssel-Wert-Paaren, wobei die Werte Strings, Integer oder Floats sein können. Gelegentlich muss ich möglicherweise das Datenstück mit einer bestimmten ID aktualisieren, indem ich das Flag-Feld von 0 auf 1 ändere. Mit anderen Worten, ich muss in der Lage sein, zufällige Schlüsselsuchen nach ID durchzuführen und die Daten zu modifizieren (eigentlich nur das Floating) Punkt "Ergebnis" Feld - so werde ich nie die Größe des Wertes ändern müssen.
Die andere Voraussetzung ist, dass ich in der Lage sein muss, diese Daten von der Festplatte (die Reihenfolge ist nicht besonders wichtig) effizient zu streamen. Dies bedeutet, dass der Festplattenkopf nicht um die Platte herumspringen muss, um die Daten zu lesen, sondern dass er in aufeinander folgenden Plattenblöcken gelesen werden sollte.
Ich schreibe dies in Java.
Ich habe über die Verwendung einer eingebetteten Datenbank nachgedacht, aber DB4O ist keine Option, da es GPL ist und der Rest meines Codes nicht ist. Ich mache mir auch Sorgen über die Effizienz der Verwendung einer eingebetteten SQL-Datenbank angesichts des Overheads der Übersetzung von und zu SQL-Abfragen.
Hat jemand irgendwelche Ideen? Könnte ich eine benutzerdefinierte Lösung dafür erstellen (wo ich direkt mit ByteBuffers beschäftigen und die ID-Lookup)?
"DB4O ist keine Option, da es GPL ist und der Rest meines Codes ist nicht" - das ist nur wichtig, wenn Sie planen, Ihren Code zu verteilen. –
Ich plane, meinen Code – sanity