2017-05-22 3 views
1

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?

+0

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

+0

Siehe diese Frage: https://Stackoverflow.com/q/43006281/1865694. –

+0

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

Antwort

1

Mein Ziel ist es, zu einer bestimmten ID zu springen und den Datensatz mit neuen Daten zu überschreiben.

Sie müssen die gesamte Datei mindestens einmal durchlaufen, um das zu tun. Da Ihre Daten trotzdem mit einer id gekennzeichnet sind, können Sie eine map<id,position_in_file> erstellen und diese Karte dann für die direkten Sprünge über seekg(position_in_file) verwenden.

Verwandte Themen