Na tej podstawie uruchamiam polecenie
< /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
Zauważam, że pamięć używana przez awk stale się powiększa podczas działania tego polecenia, na przykład zużywa ponad 500 MB pamięci do momentu odtworzenia 75 MB nieprzetworzonych danych audio. Wszystkie pozostałe polecenia w potoku utrzymują stałą ilość pamięci.
Do czego służy awk wykorzystujący tę pamięć i czy istnieje alternatywa, która przetwarza zamierzony strumień wykorzystując tylko stałą ilość pamięci?
na wypadek gdyby wersja awk miała znaczenie:
⑆ awk --version
awk version 20070501
Oto polecenie, które przetestowałem na podstawie odpowiedzi Thomasa Dickeya:
< /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...
ale zapomniałeś powiedzieć nam o wynikach tych testów - czy to rozwiązało problem, czy nie? Może nie dlatego, że każde odniesienie do elementu w a[]
pętli tworzyłoby wpisy, gdyby nie istniały, więc jeśli nie istnieje - czy to pomaga, jeśli jawnie usuwasz tablicę przed podziałem lub po użyciu, np. 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)) }'
? W tym segmencie kodu musisz pozostawić split () w jego oryginalnej lokalizacji, a nie przenosić go do BEGIN.