Darauf aufbauend führe ich den Befehl aus
< /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
Ich stelle fest, dass der von awk verwendete Speicher während der Ausführung dieses Befehls kontinuierlich wächst und beispielsweise über 500 MB Speicher verbraucht, bis 75 MB Roh-Audiodaten abgespielt wurden. Alle anderen Befehle in der Pipeline behalten eine konstante Speichermenge bei.
Wofür verwendet awk diesen Speicher und gibt es eine Alternative, bei der die beabsichtigte Stream-Verarbeitung nur eine konstante Speichermenge verwendet?
falls die awk version wichtig ist:
⑆ awk --version
awk version 20070501
Hier ist der Befehl, den ich basierend auf der Antwort von Thomas Dickey getestet habe:
< /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...
aber Sie haben vergessen, uns das Ergebnis dieser Tests mitzuteilen - hat es das Problem gelöst oder nicht? Möglicherweise nicht, da jeder Verweis auf ein Element in a[]
der Schleife Einträge erstellen würde, wenn sie nicht vorhanden wären. Wenn dies nicht der Fall ist, hilft es, wenn Sie das Array vor dem Teilen oder nach der Verwendung explizit löschen, z 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)) }'
. Bei diesem Codesegment müssen Sie split () an seiner ursprünglichen Position belassen und nicht nach BEGIN verschieben.