2016-12-20 2 views
0

Stellen Sie sich eine riesige Datei vor, die von meinem Programm bearbeitet werden sollte. Um die Lesezeit zu erhöhen, verwende ich mmap() und lese nur die Teile aus, die ich gerade sehe. Wenn ich jedoch eine Zeile in der Mitte der Datei hinzufügen möchte, was ist der beste Ansatz dafür?So bearbeiten Sie eine große Datei

Ist die einzige Möglichkeit, eine Zeile hinzuzufügen und den Rest der Datei zu verschieben? Das klingt teuer.

Also meine Frage ist im Grunde: Was ist der effizienteste Weg zum Hinzufügen von Daten in der Mitte einer großen Datei?

+0

Und nur als Randnotiz, als Sie nach "edit" großen Dateien fragen: Wenn Sie nach einem guten Editor suchen, um solche Dinge zu tun, würde ich Sie auf VisualSlick hinweisen. Ja, ein kommerzielles Produkt; aber meiner Erfahrung nach bei weitem der beste Editor im Umgang mit wirklich großen Dateien. – GhostCat

Antwort

4

Die einzige Möglichkeit, Daten in die Mitte einer (großen oder kleinen) Datei (unter Linux oder POSIX) einzufügen, besteht darin, diese Datei zu kopieren (in eine neue, später rename(2) Kopie als Original). Sie kopieren also den Kopf (bis zum Einfügepunkt), fügen die Daten an diese Kopie an und kopieren dann das Ende (nach dem Einfügepunkt). Sie könnten auch erwägen, posix_fadvise(2) (oder sogar die Linux-spezifische readahead(2) ...) zu nennen, aber das lindert nicht die Notwendigkeit, alle Daten zu kopieren. mmap(2) könnte z.B. ersetzen Sie read(2), aber was immer Sie tun, müssen Sie alle Daten kopieren.

Natürlich, wenn es passiert, dass Sie von einem anderen Stück der gleichen Größe (also keine wirkliche insertion) einen Datenblock in der Mitte der Datei ersetzen möchten, können Sie Ebene verwenden lseek(2) + write(2)

Ist die einzige Möglichkeit, eine Zeile hinzuzufügen und den Rest der Datei zu verschieben? Das klingt teuer.

Ja, es ist konzeptionell der einzige Weg.

Sie sollten in Betracht ziehen, etwas anderes als eine einfache Textdatei zu verwenden: schauen Sie in SQLite oder GDBM (sie könnten in Ihrem Anwendungsfall sehr effizient sein). Siehe auch this answer. Beide bieten Ihnen eine höhere Abstraktion als POSIX-Dateien, so dass Sie Daten "einfügen" können (natürlich basieren sie intern immer noch auf POSIX-Dateien).

+0

Ich denke das "natürlich" Teil mit Lseek und schreiben ist wichtig. –

+0

Wie löst SQLite das gleiche Problem? – iveqy

Verwandte Themen