Base en esto , estoy ejecutando el 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
Noté que la memoria utilizada por awk crece continuamente mientras se ejecuta este comando, por ejemplo, consumiendo más de 500 MB de memoria para cuando se han reproducido 75 MB de datos de audio sin formato. Todos los otros comandos en la tubería mantienen una cantidad constante de memoria.
¿Para qué sirve awk usar esta memoria? ¿Existe alguna alternativa que procese el flujo previsto utilizando solo una cantidad constante de memoria?
en caso de que la versión awk importe:
⑆ awk --version
awk version 20070501
Aquí está el comando que probé basado en la respuesta 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...
pero olvidó decirnos el resultado de esa prueba: ¿resolvió el problema o no? Puede que no, ya que cada referencia a un elemento en a[]
el bucle crearía entradas si no existieran, de lo contrario, ¿ayuda si elimina explícitamente la matriz antes de dividirla o después de usarla, por ejemplo 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 ese segmento de código, debe dejar el split () en su ubicación original, no moverlo a BEGIN.