Ich bin auf der Suche nach einer effizienten Methode für den Zugriff auf eine große Binärdatei an verschiedenen Positionen, ohne die gesamte Datei zu lesen und zu schreiben.So speichern Sie kleine Änderungen in großen Dateien schnell?
Die Datei würde aus einer sehr hohen Anzahl von Linien, die jeweils, mit fester Länge Daten und Daten unterschiedlicher Länge, beispielsweise:
<id><type><some_atributes><just_few_bytes>\n
<id><type><some_atributes><block_holding_KB_of_data>\n
<id><type><some_atributes><some_other_bytes>\n
...
Ihr Ziel ist es, eine spezifische ID zu springen und den Datensatz überschreibt mit neue Daten.
Ich dachte an seek()
und fwrite()
aber die Frage ist, wie man seek()
auf die richtige Linie/Position effizient zu lesen/schreiben, ohne jedes Byte für das Ende der Leitung überprüft? Gibt es in Datenbanken kein ähnliches Problem?
Wie wäre es mit einer intelligenten Aufteilung der Dateien in Chunks ... Ändern Sie die relevanten Chunks, und montieren Sie die ganze Datei, wenn Sie fertig sind? – WhiZTiM
Siehe diese Frage: https://Stackoverflow.com/q/43006281/1865694. –
Wie wäre es, wenn Sie das Material fester Länge in eine separate Datei oder am Anfang einfügen und für jeden Eintrag auch den Offset in der Datei speichern, in der sich dieser Block befindet. Die Indexierung mit fester Größe ermöglicht Ihnen wahlfreien Zugriff. Um den Treffer durch mehrere Lesevorgänge pro Datensatz zu reduzieren, wählen Sie eine kleine Anzahl von Datenbytes aus, die direkt im Index gespeichert werden. Aber über "Linien" und "KB von Daten" in der gleichen Spezifikation zu sprechen scheint seltsam. Wenn es binär ist, haben oder haben Sie überhaupt kein "\ n". – Peter