На основі цього я запускаю команду
< /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, постійно зростає, коли ця команда працює, наприклад, споживаючи понад 500 МБ пам'яті до моменту відтворення 75 Мб необроблених аудіоданих. Усі інші команди в конвеєрі підтримують постійну кількість пам'яті.
Для чого це awk, використовуючи цю пам'ять, і чи існує альтернатива, яка обробляє призначений потік, використовуючи лише постійний об'єм пам'яті?
у випадку, якщо версія awk має значення:
⑆ awk --version
awk version 20070501
Ось команда, яку я перевірив на основі відповіді Томаса Дікі:
< /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.