Dựa vào điều này tôi đang chạy lệnh
< /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
Tôi nhận thấy rằng bộ nhớ được sử dụng bởi awk liên tục phát triển trong khi lệnh này đang chạy, ví dụ như tiêu thụ hơn 500 MB bộ nhớ vào thời điểm 75 MB dữ liệu âm thanh thô đã được phát. Tất cả các lệnh khác trong đường ống duy trì một lượng bộ nhớ không đổi.
Awk sử dụng bộ nhớ này để làm gì và có một giải pháp thay thế nào xử lý luồng dự định chỉ sử dụng một lượng bộ nhớ không đổi?
trong trường hợp phiên bản awk có vấn đề:
⑆ awk --version
awk version 20070501
Đây là lệnh tôi đã kiểm tra dựa trên câu trả lời của 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...
nhưng bạn đã quên cho chúng tôi biết kết quả của thử nghiệm đó - nó có giải quyết được vấn đề hay không? Có thể vì mọi tham chiếu đến một phần tử trong a[]
vòng lặp sẽ tạo ra các mục nếu chúng không tồn tại nên nếu nó không - có giúp ích gì không nếu bạn xóa rõ ràng mảng trước khi tách hoặc sau khi sử dụng, ví dụ 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)) }'
? Với đoạn mã đó, bạn cần để dấu tách () ở vị trí ban đầu, không di chuyển nó sang BEGIN.