Sulla base di questo sto eseguendo il comando
< /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
Ho notato che la memoria utilizzata da awk cresce continuamente mentre questo comando è in esecuzione, ad esempio consumando oltre 500 MB di memoria quando sono stati riprodotti 75 MB di dati audio non elaborati. Tutti gli altri comandi nella pipeline mantengono una quantità costante di memoria.
A cosa serve awk questa memoria e esiste un'alternativa che elabora lo streaming previsto usando solo una quantità costante di memoria?
nel caso in cui la versione di awk sia importante:
⑆ awk --version
awk version 20070501
Ecco il comando che ho testato in base alla risposta di 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...
ma hai dimenticato di dirci il risultato di quel test - ha risolto il problema o no? Potrebbe non a[]
esserlo dal momento che ogni riferimento a un elemento nel ciclo creerebbe voci se non esistessero, quindi in caso contrario - aiuta se si cancella esplicitamente l'array prima della divisione o dopo averlo usato, ad esempio 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)) }'
? Con quel segmento di codice devi lasciare la divisione () nella sua posizione originale, non spostarla su INIZIA.