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 wa[]
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.Odpowiedzi:
To stwierdzenie jest dziwne:
Powtarzalnie dzieli stały ciąg znaków, aby utworzyć tablicę
a
. Jeśli przeniesiesz to doBEGIN
sekcji, program powinien działać tak samo - bez przydzielania nowej kopiia
tablicy dla każdego rekordu wejściowego.Adresowanie komentarzy: pętla for i wyrażenie nie przydzielają pamięci w prosty sposób. Szybkie porównanie mawk, gawk i awk pokazuje, że nie ma problemu z pierwszymi dwoma, ale
/usr/bin/awk
w OSX przecieka szybko. Jeśli Apple miałby system zgłaszania błędów, byłoby to dobre miejsce.źródło
awk 'BEGIN { split("0,2,4,5,7,9,11,12",a,","); } { for (i = 0; i < 1; i+= 0.0001) a[1]; }'
Oto odpowiednik perla, który nie wycieka:
Jest prawie identyczny.
$1
zostaje zastąpiony przez$F[0]
ii
jest zastąpiony przez$i
. Hasha
otrzymuje o rzeczywistej tablicy@a
.Mądrze byłoby wygenerować jakieś dane wejściowe i porównać różnice wyjściowe i różnice między nimi. Często występują niuanse, w jaki sposób języki interpretacyjne radzą sobie z liczbą zmiennoprzecinkową.
źródło