基于此,我正在运行命令
< /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。