'ls' comando muito lento

0

Eu tenho cerca de 17k arquivos em um diretório. Quando executo ls directory , tenho que esperar cerca de 15 a 20 segundos antes que os resultados sejam exibidos. Por outro lado, quando executo ls directory | wc -l ou ls directory | grep .xyz , os resultados são exibidos imediatamente.

Por que isso acontece e há uma maneira de corrigir isso?

    
por tytywin 01.08.2018 / 17:53

2 respostas

2

Vou adivinhar que você está usando o Linux.

  1. Se o seu comando ls tiver um alias de tal forma que mostre os arquivos & pastas em cores, então ele precisa descobrir as permissões de cada item (uma chamada stat ()) e se possui algum conjunto de "recursos de arquivo" (uma chamada getxattr ()) para escolher a cor certa. Dependendo do sistema de arquivos, essas chamadas podem ser bastante lentas se os metadados necessários ainda não tiverem sido armazenados em cache na RAM. [Atributos estendidos geralmente moram na área de dados, então cada resultado getxattr no HDD procura.]

    Por outro lado, ls | quando redirecionado para um pipe automaticamente desativa a coloração, portanto não precisa mais fazer verificações extras - apenas um loop readdir () simples que retorna o nome e tipo do arquivo, e o kernel provavelmente até mesmo implementa a leitura antecipada para isso.

  2. Normalmente, ls colunde sua saída, o que significa que precisa ler o diretório inteiro antes de poder produzir qualquer coisa. Quando executado através de um pipe, ele desativa automaticamente o modo de colunas e esse buffer não é mais necessário. (O tempo total de execução não é necessariamente mais rápido, mas a saída começa antes, fazendo com que ele se sinta mais responsivo.)

Use strace ou perf trace para verificar quais chamadas do sistema, se houver, estão demorando muito.

    
por 01.08.2018 / 19:26
0

Duas coisas:

  1. Se você executar ls primeiro e ls | wc -l depois, é possível que o primeiro leia seu HDD e o último lerá os dados armazenados em cache. Se assim for, ls inicialmente "parará" e não imprimirá nada por alguns segundos. Outro ls começará a imprimir quase imediatamente, contanto que os dados em cache ainda estejam lá. Se você começou com ls | wc -l em primeiro lugar, ele teria que esperar que o HDD fornecesse dados.
  2. Qualquer terminal funciona com velocidade própria. Formalmente stty speed mostrará algum valor, mas acho que não importa para um terminal virtual. Ainda assim, exibir caracteres e rolagem leva tempo (consulte esta pergunta ). Passar os mesmos dados por um pipe é mais rápido.
por 01.08.2018 / 18:32

Tags