ฐานบนนี้ผมใช้คำสั่ง
< /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
ฉันสังเกตเห็นว่าหน่วยความจำที่ awk ใช้เพิ่มขึ้นอย่างต่อเนื่องในขณะที่คำสั่งนี้กำลังทำงานตัวอย่างเช่นการใช้หน่วยความจำเกิน 500MB ภายในเวลาที่เล่นข้อมูลเสียงดิบ 75MB คำสั่งอื่น ๆ ทั้งหมดในไปป์ไลน์รักษาจำนวนหน่วยความจำให้คงที่
awk ใช้หน่วยความจำนี้เพื่ออะไรและมีทางเลือกอื่นที่การประมวลผลสตรีมแบบตั้งใจจะใช้หน่วยความจำเพียงจำนวนเท่าไร?
ในกรณีที่รุ่น awk สำคัญ:
⑆ awk --version
awk version 20070501
นี่คือคำสั่งที่ฉันทดสอบตามคำตอบของ 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...
แต่คุณลืมที่จะบอกเราถึงผลลัพธ์ของการทดสอบ - มันแก้ปัญหาได้หรือไม่? อาจไม่ได้เนื่องจากทุกการอ้างอิงถึงองค์ประกอบในa[]
ลูปจะสร้างรายการหากไม่มีอยู่ดังนั้นหากไม่มี - จะช่วยได้ไหมถ้าคุณลบอาเรย์อย่างชัดเจนก่อนที่จะแยกหรือหลังการใช้งานเช่น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)) }'
? ด้วยเซ็กเมนต์รหัสนั้นคุณต้องปล่อยให้แยก () ในตำแหน่งเดิมไม่ย้ายไปยัง BEGIN