基于此,我正在运行命令
< /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使用的内存不断增长,例如,在播放75MB原始音频数据时,消耗了500MB以上的内存。流水线中的所有其他命令都维护恒定数量的内存。
使用此内存的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
我还在BSD-Darwin(Mac)系统上看到内存泄漏。
—
Otheus
您说了,
—
Ed Morton
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)) }'
?使用该代码段,您需要将split()保留在其原始位置,而不是将其移至BEGIN。