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 di a[]
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, misalnya 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)) }'
? Dengan segmen kode itu, Anda harus meninggalkan pemisahan () di lokasi aslinya, bukan memindahkannya ke BEGIN.