Usando strace
, vi que a linha
number=$(expr $number + 1)
faz com que uma bifurcação, pesquisa de caminho e exec de expr
. (Estou usando o bash 4.2.45 no Ubuntu). Esse sistema de arquivos, disco e sobrecarga de processo levaram a bater apenas 28% da CPU.
Quando eu mudei essa linha para usar apenas operações internas do shell
((number = number + 1))
O bash usou cerca de 98% da CPU e o script foi executado em meia hora. Isso foi em um Celeron de 1.5GHz com CPU única.
O script como está não faz nada que roda em paralelo, então ter 32 CPUs livres não ajuda muito. No entanto, você pode certamente paralelizá-lo, por exemplo, dividindo-o em 10 loops de iteração de 1 milhão executados em paralelo, gravando em 10 arquivos diferentes e usando cat
para combiná-los.
O seguinte programa de exemplo foi adicionado por @ Arthur2e5:
max=1000000 step=40000 tmp="$(mktemp -d)"
# Spawning. For loops make a bit more sense in a init-test-incr pattern.
for ((l = 0; l < max; l += step)); do (
for ((n = l + 1, end = (step + l > max ? max : step + l);
n <= end; n++)); do
# Putting all those things into the 'buf' line gives you a 1.8x speedup.
fname="FirstName LastName \$"
lname=""
email="[email protected]"
password="1234567890"
altemail="[email protected]"
mobile="9876543210"
buf+="$fname,$lname,$email,$password,$altemail,$mobile"$'\n'
done
printf '%s\n' "$buf" > "$tmp/$l" ) &
done # spawning..
wait
# Merging. The filename order from globbing will be a mess,
# since we didn't format $l to some 0-prefixed numbers.
# Let's just do the loop again.
for ((l = 0; l < max; l += step)); do
printf '%s\n' "$(<"$tmp/$l")" >> /opt/list.csv
done # merging..
rm -rf -- "$tmp" # cleanup