Was wäre der performanteste Weg, um ein einzelnes Zeichen einer Datei mit mehreren Gigabyte vorzugeben (in meinem praktischen Fall eine Datei mit 40 GB).
Es gibt keine Beschränkung für die Implementierung, dies zu tun. Das heißt, es kann durch ein Werkzeug, ein Shell-Skript, ein Programm in einer beliebigen Programmiersprache, ... sein.
Es gibt keine wirklich einfache Lösung. Es gibt keine Systemaufrufe zum Voranstellen von Daten, nur anhängen oder neu schreiben.
Aber je nachdem, was Sie mit der Datei machen, kommen Sie vielleicht mit Tricks davon.
Wenn die Datei sequenziell verwendet wird, können Sie eine benannte Pipe erstellen und cat onecharfile.txt bigfile > namedpipe
eingeben und dann "namedpipe" als Datei verwenden . Dasselbe kann durch cat onecharfile.txt bigfile | program
erreicht werden, wenn Ihr Programm stdin als Eingabe akzeptiert.
Für den wahlfreien Zugriff könnte ein Dateisystem FUSE verwendet werden, aber wahrscheinlich ist es zu kompliziert dafür.
Wenn du deine Hände richtig dreckig machen willst, dann probiere es einfach aus.
Dies hat jedoch die Möglichkeit, Ihr Dateisystem erheblich zu zerstören, also nicht empfohlen; viel Spaß.
Lassen Sie die Datei einen Anfangsblock aus Nullzeichen haben. Wenn Sie ein Zeichen vorgeben, lesen Sie den Block, fügen Sie das Zeichen von rechts nach links ein und schreiben Sie den Block zurück. Wenn der Block voll ist, führen Sie das teurere vollständige Neuschreiben aus, um einen weiteren Nullblock voranzustellen. Auf diese Weise können Sie die Anzahl der Male um einen großen Faktor reduzieren, den Sie vollständig neu schreiben müssen.
Hinzugefügt: Bewahren Sie die Datei in zwei Unterdateien auf: A (kurz) und B (lang). Gehen Sie nach A vor, wie Sie möchten. Wenn A "groß genug" wird, wird A nach B vorangestellt (durch erneutes Schreiben) und A wird gelöscht.
Ein anderer Weg: Bewahren Sie die Datei als Verzeichnis kleiner Dateien auf ..., A000003, A000002, A000001.
Stellen Sie einfach die Datei mit der größten Nummer voran. Wenn es groß genug ist, mach die nächste Datei der Reihe nach.
Wenn Sie die Datei lesen müssen, lesen Sie sie alle in absteigender Reihenfolge.
Sie können Ihre Implementierung je nach Problem möglicherweise invertieren: Hängen Sie einzelne Zeichen an das Ende Ihrer Datei an. Wenn es an der Zeit ist, die Datei zu lesen, lesen Sie sie in reverse .
Verstecke dies hinter genug einer Abstraktionsschicht und es mag deinem Code keinen Unterschied machen, wie die Bytes physikalisch gespeichert sind.
Wenn Sie meinen, dass das Zeichen dem Anfang der gesamten Datei vorangestellt werden soll,
%Vor%oder mit sed
%Vor%wenn Sie meinen, dass das Zeichen jeder Zeile der Datei vorangestellt wird
%Vor%Wie ich verstehe, wird dies auf der Dateisystemebene gehandhabt. Wenn Sie also Daten einer Datei voranstellen, schreibt sie die Datei effektiv neu. Dies ist der gleiche Grund, warum die ID3-Tags in MP3-Dateien mit Nullen aufgefüllt werden, so dass zukünftige Updates nicht die gesamte Datei neu schreiben, sondern nur diese reservierten Bytes aktualisieren.
Also, was auch immer Sie verwenden, wird ungefähr ähnliche Ergebnisse geben. Was Sie ausprobieren können, ist einige Tests mit einer benutzerdefinierten Kopierfunktion durchzuführen, die in größeren Blöcken liest / schreibt als die Standardsystemkopie, sagen wir 2MB oder 5MB, was die Leistung verbessern könnte. Letztendlich ist Ihre Festplatten-I / O hier der Flaschenhals.
Der absolut leistungsstärkste Weg scheint es zu sein, in die Ebene der Sektoren zu gelangen und wie die Datei tatsächlich gespeichert wird. Ich bin mir nicht sicher, ob das Betriebssystem dann ein Faktor wird, aber die Zielplattform könnte es sein, trotzdem ist es nützlich für uns, zu wissen, auf was Sie laufen.
Ich denke, das ist ein Fall, in dem C die offensichtliche Wahl ist, diese Art von Low-Level-Zeug ist genau das, was eine Systemprogrammiersprache für ist.
Können Sie uns sagen, was Sie tun, wäre interessant.
Tags und Links performance file