Hallo,
ich muss Daten in eine Datei speichern und natürlich auch wieder auslesen.
Die Daten entsprechen einer (riesigen) Tabelle, dessen Spalten nur Werte eines einzelnen Typs enthalten z.B. int, short, String, usw.
Das ganze muss jetzt in eine oder mehrere Dateien gespeichert werden und die Datenmenge nimmt rapide zu. (Datenbankanbindung ist leider nicht erwünscht)
Ich füge also immer "hinten" eine neue Datenzeile an und falls eine Spalte eine Key-Spalte ist, speichere ich den Wert und die Zeilennr. in einem Index. Primär interessiert nur das Einfügen und Lesen von Daten, evtl. noch das Updaten. Das Löschen bleibt aussen vor.
Falls es nur Spaltenwerte mit fixer Breite wären, könnte ich ja einfach die Bytes aneinanderfügen und in die Datei schreiben.
Bsp.: Spalten 1-3 mit int, short,long
-> byte[] bytes= new bytes[4+2+8] und die Werte in bytes umwandeln.
Oder macht es mehr Sinn, die Werte direkt mit writeXX() reinzuschreiben?
Was mache ich aber wenn ich auch noch String-Spalten habe(= variable Breite)?
Eine Idee wäre, die Länge des Strings mit zu speichern oder gleich für alle Spalten Tupel aus Datenlänge und Daten zu speichern? Spricht etwas dagegen? Gibt es eine andere/bessere Möglichkeit?
Was passiert, wenn sich Werte ändern? z.B. ein String-Wert überschrieben wird? Müsste ich dann die ganzen Daten in der Datei verschieben?
Zu berücksichtigen ist leider auch noch, dass nachträglich Spalten angefügt werden können.
Würde es daher Sinn machen, pro Spalte eine Datei anzulegen?
Ich vermute zumindest, dass würde die Performance beim speichern einer "Zeile" arg negativ beeinflussen, oder? Schliesslich müsste ich n-mal die passende Datei öffnen und den Wert am Ende eintragen!?
Wie realisiere ich das am Besten? Mir dreht sich schon ein wenig der Kopf...
Hoffe ihr könnt helfen...
Ralf
ich muss Daten in eine Datei speichern und natürlich auch wieder auslesen.
Die Daten entsprechen einer (riesigen) Tabelle, dessen Spalten nur Werte eines einzelnen Typs enthalten z.B. int, short, String, usw.
Das ganze muss jetzt in eine oder mehrere Dateien gespeichert werden und die Datenmenge nimmt rapide zu. (Datenbankanbindung ist leider nicht erwünscht)
Ich füge also immer "hinten" eine neue Datenzeile an und falls eine Spalte eine Key-Spalte ist, speichere ich den Wert und die Zeilennr. in einem Index. Primär interessiert nur das Einfügen und Lesen von Daten, evtl. noch das Updaten. Das Löschen bleibt aussen vor.
Falls es nur Spaltenwerte mit fixer Breite wären, könnte ich ja einfach die Bytes aneinanderfügen und in die Datei schreiben.
Bsp.: Spalten 1-3 mit int, short,long
-> byte[] bytes= new bytes[4+2+8] und die Werte in bytes umwandeln.
Oder macht es mehr Sinn, die Werte direkt mit writeXX() reinzuschreiben?
Was mache ich aber wenn ich auch noch String-Spalten habe(= variable Breite)?
Eine Idee wäre, die Länge des Strings mit zu speichern oder gleich für alle Spalten Tupel aus Datenlänge und Daten zu speichern? Spricht etwas dagegen? Gibt es eine andere/bessere Möglichkeit?
Was passiert, wenn sich Werte ändern? z.B. ein String-Wert überschrieben wird? Müsste ich dann die ganzen Daten in der Datei verschieben?
Zu berücksichtigen ist leider auch noch, dass nachträglich Spalten angefügt werden können.
Würde es daher Sinn machen, pro Spalte eine Datei anzulegen?
Ich vermute zumindest, dass würde die Performance beim speichern einer "Zeile" arg negativ beeinflussen, oder? Schliesslich müsste ich n-mal die passende Datei öffnen und den Wert am Ende eintragen!?
Wie realisiere ich das am Besten? Mir dreht sich schon ein wenig der Kopf...
Hoffe ihr könnt helfen...
Ralf
Zuletzt bearbeitet: