fuite de memory awk?

Sur cette base, j'exécute la command

< /dev/urandom hexdump -v -e '/1 "%u\n"' | awk '{ split("0,2,4,5,7,9,11,12",a,","); for (i = 0; i < 1; i+= 0.0001) printf("%08X\n", 100*sin(1382*exp((a[$1 % 8]/12)*log(2))*i)) }' | xxd -r -p | sox -traw -r44100 -b16 -e unsigned-integer - -tcoreaudio 

Je remarque que la memory utilisée par awk augmente continuellement pendant que cette command est en cours d'exécution, par exemple consommant plus de 500 Mo de memory au moment où 75 Mo de données audio brutes ont été jouées. Toutes les autres commands du pipeline maintiennent une quantité constante de memory.

Qu'est-ce que awk en utilisant cette memory et y a-t-il une alternative qui fait le traitement de stream prévu en utilisant seulement une quantité constante de memory?


au cas où la version awk count:

 ⑆ awk --version awk version 20070501 

Voici la command que j'ai testée sur la base de la réponse de Thomas Dickey:

 < /dev/urandom hexdump -v -e '/1 "%u\n"' | awk 'BEGIN { split("0,2,4,5,7,9,11,12",a,",") } { for (i = 0; i < 1; i+= 0.0001) printf("%08X\n", 100*sin(1382*exp((a[$1 % 8]/12)*log(2))*i)) }' | xxd -r -p | sox -traw -r44100 -b16 -e unsigned-integer - -tcoreaudio 

Cette déclaration est étrange:

 split("0,2,4,5,7,9,11,12",a,","); 

Il divise de façon répétitive une string constante pour créer un tableau a . Si vous déplacez cela dans une section BEGIN , le programme devrait fonctionner de la même façon, sans allouer une nouvelle copy du tableau pour chaque logging d'input.

Adressage des commentaires: la for-loop et l'expression n'allouent pas la memory d'une manière simple. Une comparaison rapide de mawk, gawk et awk montre qu'il n'y a pas de problème avec les deux premiers, mais /usr/bin/awk sur OSX fuit rapidement. Si Apple avait un système de signalement de bogues, ce serait l'endroit où aller.

Voici un équivalent perl qui ne fuit pas:

 perl -lne 'BEGIN { @a=(0,2,4,5,7,9,11,12);} for ($i = 0; $i < 1; $i+= 0.0001) { printf("%08X\n", 100*sin(1382*exp($a[$F[0] % 8]/12)*log(2))*$i) }' 

C'est presque identique. $1 est remplacé par $F[0] et i est remplacé par $i . Le hachage a est remplacé par un tableau réel, @a .

Vous seriez sage de générer des inputs et de comparer les différences de sortie et de note entre les deux. Il y a souvent des nuances quant à la façon dont les langages d'interprétation traitent des virgules flottantes.