2016-07-06 3 views
1

Ich arbeite derzeit mit CSV-Dateien, die 10 GB groß sein können, und müssen die Header dynamisch je nach Anwendungsfall bearbeiten.Linux sed liest ganze Datei, wenn nur die erste Zeile bearbeitet

Dazu verwende ich:

sed -i '1,1s/id/id:ID(Person)/g' etc. 

die den gewünschten Effekt hat nur die Header bearbeiten, sondern kann nach oben von 10 Sekunden in Anspruch nehmen. Ich stelle mir das vor, weil die ganze Datei immer noch gestreamt wird, aber ich kann nichts finden, um das zu verhindern.

Alle Ideen oder ein Punkt in die richtige Richtung würden sehr geschätzt werden.

+3

Wenn es nicht die gesamte Datei umschreibt, um die Daten zu verschieben, wie wird es 11 weitere Bytes passen? Sie wollen 'ID (Person)' die nächsten 11 Bytes überschreiben? – TessellatingHeckler

+0

@Thomas: Mein Kommentar war fehl am Platz. Entfernt das. So wird das in Kürze sein. ;) – sjsam

+0

Dies ist E/A-gebunden. Hast du die Laufzeit mit 'cat file> file.copy' verglichen? Du wirst nicht schneller gehen können. –

Antwort

1

sed ist nicht das Problem. Das Problem ist, dass Sie eine 10-GB-Datei streamen. Wenn dies die einzige Operation ist, die Sie daran vornehmen, ist sed wahrscheinlich nicht viel schlechter als jedes andere zeilenbasierte Dienstprogramm (awk usw.).

Perl kann einen besseren Job machen, wenn Sie zuerst die ganze Datei lesen, aber Ihr Speicherbedarf wird ziemlich groß sein und abhängig von Ihrem System können Sie Paging starten.

Wenn Sie etwas häufig und für eine lange Zeit tun, können Sie in einer niedrigeren Sprache bessere Ergebnisse erzielen, indem Sie größere Datenblöcke lesen. Dadurch kann die Blockebene Ihren Festplattenzugriff für Sie optimieren . Wenn Sie die "Chunks" groß genug für die Blockschicht halten, aber klein genug, um Paging zu vermeiden, sollten Sie in der Lage sein, den Sweet Spot zu treffen.

Wahrscheinlich nicht wert für eine 1 aus Umwandlung.

Verwandte Themen