Baz üzerindeki bu ben komutu çalıştırıyorum
< /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
Bu komut çalışırken awk tarafından kullanılan belleğin sürekli olarak büyüdüğünü fark ediyorum, örneğin 75MB ham ses verisi çalındığında 500MB'ın üzerinde bellek tüketiyor. Boru hattındaki diğer tüm komutlar sabit miktarda bellek tutar.
Awk bu hafızayı ne için kullanıyor?
awk sürümü önemliyse:
⑆ awk --version
awk version 20070501
İşte Thomas Dickey'in cevabına dayanarak test ettiğim komut:
< /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...
ama bize bu testin sonucunu anlatmayı unuttun - sorunu çözdü mü çözmedi mi? a[]
Döngüdeki bir öğeye yapılan her başvurunun, eğer olmasaydı girişler oluşturmayacağı için bu olmayabilir - eğer yoksa - diziyi bölmeden önce veya kullandıktan sonra açıkça silmeniz yardımcı olur, örneğin 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)) }'
? Bu kod segmentiyle split () işlevini orijinal konumunda bırakmanız, BEGIN'e taşımamanız gerekir.