Ich habe 25 GB Textdatei, die eine Zeichenfolge in nur wenigen Zeilen ersetzt werden muss. Ich kann sed
erfolgreich verwenden, aber das Ausführen dauert sehr lange.
sed -i 's|old text|new text|g' gigantic_file.sql
Gibt es einen schnelleren Weg, dies zu tun?
sed
replace
large-files
Eisaacson
quelle
quelle
Antworten:
Du kannst es versuchen:
Von diesem Verweis :
Hier ist ein Vergleich über eine 10G-Datei. Vor:
Nach:
quelle
sed
ist falsch geschrieben. Ich habe diesen Beitrag gestern bearbeitet, um den letztensed
Befehl zu korrigieren, der sein solltetime sed -i '/original/ s//ketan/g' wiki10gb
und nichttime sed -i '/ketan/ s//original/g' wiki10gb
. Ich mache meine Bearbeitung heute wieder rückgängig, weil 1. die Zeiten nicht mehr mit dem Befehl übereinstimmen und 2. ich denselben Test mit GNU an einer Datei mit mehr als 3 GB durchgeführt habe und keinen Unterschied zwischen den beidensed
Alternativen feststelle. Ich vermute, dass der Zeitunterschied auf die Rechtschreibfehler zurückzuführen ist.time
persönlich habe viele Schwankungen in den Ergebnissen gesehen, aber insgesamt gab es keinen Zeitunterschied.Die kurze Antwort lautet "Nein" - Ihr limitierender Faktor für diese Art von Operation ist Disk IO. Es gibt keine Möglichkeit, 25 GB einer Festplatte schneller zu streamen. Wenn Sie keine direkte Bearbeitung vornehmen und das Ergebnis
sed
auf ein separates Laufwerk schreiben (sofern vorhanden), können Sie möglicherweise eine geringfügige Verbesserung erzielen. Auf diese Weise können Sie von einem Laufwerk lesen, während Sie auf ein anderes schreiben weniger Streit als Ergebnis.Sie könnte es beschleunigen sie ein wenig in der Lage durch nicht für jede Zeile der Regex - Engine - so zum Beispiel unter Verwendung von Perl (ich bin mir ziemlich sicher , dass Sie mit diesem tun ,
sed
aber ich weiß nicht , die Syntax) - dies beginnt ab Zeile 10.000 weiter.Und wenn es irgendwelche Komplikationen in der RE (Metazeichen) gibt, wird die Effizienz der Regex-Engine leicht verbessert, wenn diese minimiert werden .
quelle
sed -i '10000,$ s/old_text/new_text/g'
sed
vergleicht - ich nehme an, dass es ein bisschen schneller ist, aber aufgrund der Dateigröße nicht viel.sed
inperl
, aber diese können Sie auch ausführlichere Skripte zu schreiben.Wenn der neue und der alte Text gleich lang sind, können Sie in die Datei suchen und nur die geänderten Bytes schreiben, anstatt die gesamte Datei zu kopieren. Andernfalls sind Sie in der Lage, viele Daten zu verschieben.
Hinweis: Dies ist schwierig und erfordert das Schreiben von benutzerdefiniertem Code.
Auf der Manpage finden Sie fseek, wenn Sie in C oder C ++ arbeiten, oder Ihre bevorzugten Sprach-Wrapper für das Suchen und Schreiben von Systemaufrufen.
Wenn Sie nur auf der Befehlszeile bestehen und die Byte-Offsets des Texts erhalten, können Sie den Ersetzungstext mit sorgfältig geschriebenen "dd" -Befehlen an die richtige Stelle schreiben.
quelle