Berdasarkan ini saya menjalankan perintah
< /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
Saya perhatikan bahwa memori yang digunakan oleh awk terus bertambah saat perintah ini berjalan, misalnya mengonsumsi lebih dari 500MB memori saat 75MB data audio mentah diputar. Semua perintah lain dalam pipa mempertahankan jumlah memori yang konstan.
Untuk apa awk menggunakan memori ini dan apakah ada alternatif yang melakukan pemrosesan aliran yang dimaksudkan hanya menggunakan jumlah memori yang konstan?
dalam hal versi awk penting:
⑆ awk --version
awk version 20070501
Inilah perintah yang saya uji berdasarkan jawaban Thomas Dickey:
< /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...
tetapi Anda lupa memberi tahu kami hasil pengujian itu - apakah itu menyelesaikan masalah atau tidak? Mungkin tidak karena setiap referensi ke elemen dia[]
dalam loop akan membuat entri jika tidak ada sehingga jika tidak - apakah itu membantu jika Anda secara eksplisit menghapus array sebelum membelah atau setelah menggunakannya, misalnyaawk '{ 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)) }'
? Dengan segmen kode itu, Anda harus meninggalkan pemisahan () di lokasi aslinya, bukan memindahkannya ke BEGIN.Jawaban:
Pernyataan ini aneh:
Ini secara berulang membagi string konstan untuk membuat array
a
. Jika Anda memindahkannya keBEGIN
bagian, program harus bekerja sama - tanpa mengalokasikan salinana
array untuk setiap input-record.Mengatasi komentar: for-loop dan ekspresi tidak mengalokasikan memori secara sederhana. Perbandingan cepat antara mawk, gawk dan awk menunjukkan bahwa tidak ada masalah dengan dua yang pertama, tetapi
/usr/bin/awk
pada OSX bocor dengan cepat. Jika Apple memiliki sistem pelaporan bug, itu akan menjadi tempatnya.sumber
awk 'BEGIN { split("0,2,4,5,7,9,11,12",a,","); } { for (i = 0; i < 1; i+= 0.0001) a[1]; }'
Berikut ini setara dengan perl yang tidak bocor:
Hampir identik.
$1
digantikan oleh$F[0]
dani
diganti dengan$i
. Hasha
diganti dengan array aktual@a
,.Anda sebaiknya menghasilkan beberapa input dan membandingkan perbedaan keluaran dan catatan di antara keduanya. Seringkali ada nuansa bagaimana bahasa interpretatif menangani floating point.
sumber