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 noa[]
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 exemploawk '{ 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.Respostas:
Esta afirmação é estranha:
Ele divide repetidamente uma cadeia constante para criar uma matriz
a
. Se você mover isso para umaBEGIN
seção, o programa funcionará da mesma maneira - sem alocar uma nova cópia daa
matriz para cada registro de entrada.Endereçando comentários: o loop for e a expressão não alocam memória de maneira simples. Uma rápida comparação de mawk, gawk e awk mostra que não há problema com os dois primeiros, mas
/usr/bin/awk
no OSX vaza rapidamente. Se a Apple tivesse um sistema de relatório de bugs, esse seria o lugar para você.fonte
awk 'BEGIN { split("0,2,4,5,7,9,11,12",a,","); } { for (i = 0; i < 1; i+= 0.0001) a[1]; }'
Aqui está um equivalente perl que não vaza:
É quase idêntico.
$1
é substituído por$F[0]
ei
é substituído por$i
. O hasha
é substituído por uma matriz real@a
,.Seria sensato gerar alguma entrada e comparar a saída e observar as diferenças entre as duas. Muitas vezes existem nuances de como as linguagens interpretativas lidam com o ponto flutuante.
fonte