Por que esse loop de shell simples fica parado e começa a consumir grandes quantidades de memória?

2

Um amigo meu conhecido pelo tratamento desumano de máquinas queria enfatizar sua CPU, e assim escreveu uma frase como esta:

for z in {1..100000000};do num1=$(($z * $z)) && echo $num1;done

Quando executado, este loop apenas fica sem saída e uma rápida olhada em top mostra o consumo de quantidades massivas de memória ( gigabytes após alguns minutos).

Como escrito, eu esperaria que este processo fosse executado sequencialmente - como em, passe a variável z , calcule, ecoe o resultado, repita.

Em vez disso, tentar isso com limites superiores menores faz com que pareça que tudo é calculado na frente e, em seguida, é despejado na tela en masse . Como em, ele fica por um momento fazendo os cálculos, então faz o echo de uma só vez.

Por que esse loop se comporta dessa maneira?

    
por Mikey T.K. 09.03.2016 / 22:02

1 resposta

4

Como descrito aqui , o operador de intervalo constrói o intervalo (cria uma matriz de números inteiros) antes de permitir que você faça coisas como iterar sobre ele. Você pode estar melhor com um loop while:

 z=1 ; while [[ $z -le 100000000 ]] ; do num1=$(($z * $z)) && echo $num1 ; z=$(($z + 1)) ; done

(Embora seja improvável que isso realmente force a CPU, pois o eco causa algum alívio. Meu próprio sistema atinge apenas cerca de 30% de utilização ao executar isso.)

    
por 09.03.2016 / 22:19