Warum ist tar | tar so viel schneller als cp?

10

Zum rekursiven Kopieren eines Verzeichnisses scheint es viel schneller zu sein , ein Verzeichnis tarzu packen und dann die Ausgabe tarzum Entpacken an ein anderes weiterzuleiten als cp -r(oder cp -a).

Warum ist das? Und warum kann man es nicht cpschneller machen, wenn man es unter der Haube genauso macht?

Bearbeiten: Ich habe diesen Unterschied bemerkt, als ich versucht habe, eine riesige Verzeichnisstruktur zu kopieren, die Zehntausende von Dateien und Ordnern enthält, die tief verschachtelt sind, aber insgesamt nur etwa 50 MB groß sind. Ich bin mir nicht sicher, ob das relevant ist.

Callum
quelle
Das ist eine interessante Frage. Einige Antworten finden Sie hier: stackoverflow.com/questions/316078 und hier: unix.stackexchange.com/questions/66647
Teresa e Junior

Antworten:

6

Cpführt open-read-close-open-write-close in einer Schleife über alle Dateien aus. Das Lesen von einem Ort und das Schreiben an einen anderen erfolgt also vollständig verschachtelt. Tar|tarLiest und schreibt in separaten Prozessen und tarverwendet außerdem mehrere Threads, um mehrere Dateien gleichzeitig zu lesen (und zu schreiben), sodass der Festplattencontroller effektiv viele Datenblöcke gleichzeitig abrufen, puffern und speichern kann. Alles in allem tarermöglicht es jeder Komponente, effizient zu arbeiten, während cpdas Problem in unterschiedliche, ineffizient kleine Teile aufgeteilt wird.

Pum Walters
quelle
Können wir wirklich sagen, dass dies für alle cpImplementierungen gilt? Woher wissen wir, dass das stimmt? Und warum cpsollte so ineffizient geschrieben werden? Jede Lehrbuchimplementierung einer Dateikopie liest einen Puffer von n Bytes gleichzeitig und schreibt sie auf die Festplatte, bevor weitere n Bytes gelesen werden. Aber Sie sagen, cpliest immer die ganze Datei, bevor Sie die ganze Kopie schreiben?
LarsH