Por que o tar | tar é muito mais rápido que o cp?


10

Para copiar recursivamente um diretório, usar tarpara empacotar um diretório e canalizar a saída para outro tarpara descompactar parece ser muito mais rápido do que usar cp -r(ou cp -a).

Por que é isso? E por que não pode cpser feito mais rápido, fazendo da mesma maneira sob o capô?

Editar: notei essa diferença ao tentar copiar uma enorme estrutura de diretórios contendo dezenas de milhares de arquivos e pastas, profundamente aninhados, mas totalizando apenas cerca de 50 MB. Não tenho certeza se isso é relevante.


Essa é uma pergunta interessante. Você pode encontrar algumas respostas aqui: stackoverflow.com/questions/316078 e aqui: unix.stackexchange.com/questions/66647
Teresa e Junior

Respostas:


6

Cpabre-lê-fecha-abre-escreve-fecha em um loop sobre todos os arquivos. Portanto, ler de um lugar e escrever para outro ocorre totalmente intercalado. Tar|tarfaz leitura e gravação em processos separados e, além disso, tarusa vários threads para ler (e gravar) vários arquivos 'de uma só vez', permitindo efetivamente ao controlador de disco buscar, armazenar em buffer e armazenar muitos blocos de dados ao mesmo tempo. Em suma, tarpermite que cada componente trabalhe com eficiência, enquanto cpdivide o problema em pedaços díspares e ineficientemente pequenos.


Podemos realmente dizer que isso é verdade em todas as cpimplementações? Como sabemos que isso é verdade? E por que cpseria escrito de maneira tão ineficiente? Qualquer implementação de livro de cópia de um arquivo lê um buffer de n bytes de cada vez e os grava no disco antes de ler outros n bytes. Mas você está dizendo que cpsempre lê o arquivo inteiro antes de escrever a cópia inteira?
Larsh
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.