Sur cette base, j'exécute la commande
< /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 mémoire utilisée par awk augmente continuellement pendant l'exécution de cette commande, par exemple en consommant plus de 500 Mo de mémoire au moment où 75 Mo de données audio brutes ont été lues. Toutes les autres commandes du pipeline conservent une quantité de mémoire constante.
À quoi sert awk cette mémoire et existe-t-il une alternative qui fait le traitement de flux prévu en utilisant uniquement une quantité constante de mémoire?
au cas où la version awk compte:
⑆ awk --version
awk version 20070501
Voici la commande 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
Here's the command I tested...
mais vous avez oublié de nous dire le résultat de ces tests - cela a-t-il résolu le problème ou non? Ce n'est peut-être pas le cas, car chaque référence à un élément dans a[]
la boucle créerait des entrées si elles n'existaient pas, si ce n'est pas le cas - cela aide-t-il si vous supprimez explicitement le tableau avant de le fractionner ou après l'avoir utilisé, par exemple awk '{ delete a; 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)) }'
? Avec ce segment de code, vous devez laisser le split () à son emplacement d'origine, pas le déplacer vers BEGIN.