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 dansa[]
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 exempleawk '{ 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.Réponses:
Cette déclaration est étrange:
Il fractionne de manière répétitive une chaîne constante pour créer un tableau
a
. Si vous déplacez cela dans uneBEGIN
section, le programme devrait fonctionner de la même manière - sans allouer une nouvelle copie dua
tableau pour chaque enregistrement d'entrée.Adressage des commentaires: la boucle for et l'expression n'allouent pas la mémoire de 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 rapport de bogues, ce serait l'endroit où aller.la source
awk 'BEGIN { split("0,2,4,5,7,9,11,12",a,","); } { for (i = 0; i < 1; i+= 0.0001) a[1]; }'
Voici un équivalent perl qui ne fuit pas:
C'est presque identique.
$1
est remplacé par$F[0]
eti
est remplacé par$i
. Le hachagea
est remplacé par un tableau réel,@a
.Il serait sage de générer une entrée et de comparer la sortie et de noter les différences entre les deux. Il existe souvent des nuances quant à la manière dont les langages d'interprétation traitent la virgule flottante.
la source