Ich habe mehr als 10k-Dateien mit insgesamt über 20 GB, die ich zu einer Datei verketten muss.
Gibt es einen schnelleren Weg als
cat input_file* >> out
?
Der bevorzugte Weg wäre ein Bash-Befehl, Python ist auch akzeptabel, wenn nicht wesentlich langsamer.
bash
shell-script
files
cat
fsperrle
quelle
quelle
find
sortiert Dateien nicht wie ein Shell-Glob.out
es sich auf einer anderen Festplatte befindet.Antworten:
Nein, Katze ist sicherlich der beste Weg, dies zu tun. Warum sollte man Python verwenden, wenn für diesen Zweck bereits ein Programm in C geschrieben ist? Möglicherweise möchten Sie jedoch die Verwendung
xargs
in Betracht ziehen, wenn die Befehlszeilenlänge überschritten wirdARG_MAX
und Sie mehr als eine benötigencat
. Mit GNU-Werkzeugen entspricht dies dem, was Sie bereits haben:quelle
find
durchgeleitet wirdsort
. Ohne dies würden die Dateien in einer beliebigen Reihenfolge aufgelistet (definiert durch das Dateisystem, das die Reihenfolge der Dateierstellung sein könnte).bash
Glob. Ansonsten sehe ich keine Fälle, in denenxargs
odercat
würde sich nicht wie erwartet verhalten.xargs
ruft nachcat
Bedarf auf, um einen E2BIG-Fehler von execve (2) zu vermeiden.Das Zuweisen des Speicherplatzes für die Ausgabedatei als Erstes kann die Gesamtgeschwindigkeit verbessern, da das System die Zuordnung nicht bei jedem Schreibvorgang aktualisieren muss.
Zum Beispiel, wenn unter Linux:
Ein weiterer Vorteil ist, dass der Kopiervorgang nicht ausgeführt wird, wenn nicht genügend freier Speicherplatz vorhanden ist.
Wenn diese Option aktiviert ist
btrfs
, können Siecopy --reflink=always
die erste Datei (die keine Datenkopie impliziert und daher fast augenblicklich ist) und den Rest anhängen. Wenn es 10000 Dateien gibt, wird das wahrscheinlich keinen großen Unterschied machen, es sei denn, die erste Datei ist sehr groß.Es gibt eine API, um das zu verallgemeinern, um alle Dateien (die
BTRFS_IOC_CLONE_RANGE
ioctl
) erneut zu kopieren , aber ich konnte kein Hilfsprogramm finden, das diese API verfügbar macht, also müssten Sie es in C (python
oder in einer anderen Sprache, vorausgesetzt, sie können beliebigeioctl
s aufrufen ) .Wenn die Quelldateien spärlich sind oder große Sequenzen von NUL-Zeichen enthalten, können Sie mit (auf GNU-Systemen) eine spärliche Ausgabedatei erstellen (um Zeit und Speicherplatz zu sparen):
quelle
>
noch sein>>
, aber1<>
wie gesagt in die Datei schreiben .<>
ist der Standard-Bourne / POSIX-Umleitungsoperator für Lesen und Schreiben. Einzelheiten finden Sie in Ihrem Shell-Handbuch oder in der POSIX-Spezifikation . Die Standardeinstellungfd
ist0
für den<>
Operator (<>
ist kurz für0<>
, wie<
ist kurz für0<
und>
kurz für1>
), daher müssen Sie die1
stdout explizit umleiten. Hier ist es nicht so sehr so, dass wir read + write (O_RDWR
) benötigen , aber dass wir nicht wollenO_TRUNC
(wie in>
), dass die Zuordnung aufgehoben wird, was wir gerade zugewiesen haben.dd
oder über Lesen vorwärts suchen .fallocate
der Overhead der zusätzlichen Kosten zunichte gemacht wirdfind
, auch wenn er beim zweiten Mal schneller sein wird.btrfs
sicherlich eröffnet sich aber einige interessante möglichkeiten.