awk bellek sızıntısı?


11

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

Ayrıca BSD-Darwin (Mac) sistemimde bir bellek sızıntısı görüyorum.
16'da Otheus

Dedin 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.
Ed Morton

Yanıtlar:


11

Bu ifade tuhaf:

split("0,2,4,5,7,9,11,12",a,",");

Bir dizi oluşturmak için sürekli olarak sabit bir dize böler a. Bunu bir BEGINbölüme taşırsanız , program aher giriş kaydı için dizinin yeni bir kopyasını ayırmadan aynı şekilde çalışmalıdır .

Yorumları adresleme: for-loop ve ifade hafızayı basit bir şekilde ayırmaz. Mawk, gawk ve awk'in hızlı bir şekilde karşılaştırılması, ilk ikisinde sorun olmadığını gösterir, ancak /usr/bin/awkOSX'te hızlı bir şekilde sızar. Apple'ın bir hata raporlama sistemi olsaydı, gidilecek yer bu olurdu.


1
Mac bilgisayarımda önerdiğin gibi yaptım (OP değilim). Hala awk ile bir bellek sızıntısı görüyorum.
16'da Otheus

Her nasılsa, sadece referans bir karma kullanımları bellek.
16'da Otheus

Burada aynı; Hala hafıza büyümesini görüyorum. Ayrıca kaba bir karşılaştırma yaptım ve bellek kullanımı bu değişiklikle aynı oranda artıyor gibi görünüyor.
16:20

Bu bile bir bellek sızıntısına neden olacak:awk 'BEGIN { split("0,2,4,5,7,9,11,12",a,","); } { for (i = 0; i < 1; i+= 0.0001) a[1]; }'
Otheus

Mawk veya gawk'a geçebilirsiniz. Apple'ın temel sistemi bazı gerçek antikaları içerir.
Thomas Dickey

5

İşte sızıntı yapmayan bir perl eşdeğeri:

perl -lne 'BEGIN { @a=(0,2,4,5,7,9,11,12);}
   for ($i = 0; $i < 1; $i+= 0.0001) {
     printf("%08X\n", 100*sin(1382*exp($a[$F[0] % 8]/12)*log(2))*$i) }'

Neredeyse aynı. $1ile değiştirilir $F[0]ve iile değiştirilir $i. Karma agerçek bir dizi ile değiştirilir @a.

Bazı girdiler oluşturmak ve ikisi arasındaki çıktı ve not farklarını karşılaştırmak akıllıca olacaktır. Yorumlayıcı dillerin kayan nokta ile nasıl başa çıktığı konusunda genellikle nüanslar vardır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.