I just want to know if I need to redirect the output in different files. (e.g.: write several files of 2000 lines)
A divisão em um número maior de arquivos não será necessariamente igual à execução mais rápida. Três casos de teste simples ilustram isso. Estes três casos imprimem 3 milhões de linhas cada. Estes são listados na ordem de velocidade de execução, mais rápida para mais lenta.
-
Um redirecionamento fora do loop
for i in $(seq $((3000000/2000))); do seq 2000; done > file
-
Anexando ao mesmo arquivo, dentro do loop
for i in $(seq $((3000000/2000))); do seq 2000 >> file; done
-
Dividindo a saída para vários arquivos
for i in $(seq $((3000000/2000))); do seq 2000 > file$i; done
Os últimos comandos consomem constantemente mais tempo do usuário e do sistema do que os comandos anteriores.
A partir disso, podemos concluir que a divisão em um número maior de arquivos não garante o aumento do desempenho neste caso simples. O oposto é verdadeiro.
Número de operações de E / S
O desempenho não depende apenas do tamanho do arquivo, mas também do número de operações de E / S. Ao anexar ( >>
), mais chamadas de E / S ocorrem para buscar o final do arquivo.
Este primeiro script executa as operações de E / S ( >>
) fora do for
loop:
$ cat outloop.sh
#!/bin/sh
>file
for i in $(seq 1 ${1:?})
do
echo $i
done >> file
Este script, por outro lado, executa as operações de E / S ( >>
) em cada iteração, dentro do for
loop:
$ cat inloop.sh
#!/bin/sh
>file
for i in $(seq 1 ${1:?})
do
echo $i >> file
done
Executar e comparar, veja como a localização do operador >>
afeta o desempenho:
$ x=500000; time sh outloop.sh $x; time sh inloop.sh $x;
real 0m1.227s
user 0m0.389s
sys 0m0.859s
real 0m2.996s
user 0m0.809s
sys 0m2.197s
Colocando o operador de redirecionamento fora o loop dobra o desempenho ao escrever 500000 linhas (no meu sistema).