Com base nisso , estou executando o 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
Percebo que a memória usada pelo awk cresce continuamente enquanto esse comando está em execução, por exemplo, consumindo mais de 500 MB de memória no momento em que 75 MB de dados brutos de áudio foram reproduzidos. Todos os outros comandos no pipeline mantêm uma quantidade constante de memória.
Para que serve o awk usando essa memória e existe uma alternativa que processa o fluxo pretendido usando apenas uma quantidade constante de memória?
caso a versão awk seja importante:
⑆ awk --version
awk version 20070501
Aqui está o comando que testei com base na resposta 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...mas esqueceu de nos contar o resultado desse teste - isso resolveu o problema ou não? Pode não ser que todas as referências a um elemento no a[]loop criem entradas se elas não existirem, se não existirem - ajuda se você excluir explicitamente a matriz antes de dividir ou depois de usá-la, por exemplo 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)) }'? Com esse segmento de código, você precisa deixar o split () no local original, não movê-lo para BEGIN.