awk内存泄漏?


11

基于此,我正在运行命令

< /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

您说了,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。
Ed Morton

Answers:


11

这个说法很奇怪:

split("0,2,4,5,7,9,11,12",a,",");

它重复地拆分一个常量字符串以创建一个数组a。如果将其移至某个BEGIN部分,则程序应能以相同的方式运行-无需a为每个输入记录分配新的数组副本。

解决注释:for循环和表达式不能以简单的方式分配内存。快速比较mawk,gawk和awk显示前两个没有问题,但是/usr/bin/awk在OSX上确实迅速泄漏。如果苹果有一个错误报告系统,那就去了。


1
我按照您在Mac上的建议进行操作(我不是OP)。我仍然看到awk的内存泄漏。
Otheus

不知何故,只是引用一个哈希占用内存。
Otheus

同样在这里; 我仍然看到内存的增长。我还进行了粗略的比较,并且此更改似乎使内存使用量以相同的速度增长。
bames53 '16

即使这样也会导致内存泄漏:awk 'BEGIN { split("0,2,4,5,7,9,11,12",a,","); } { for (i = 0; i < 1; i+= 0.0001) a[1]; }'
Otheus

您可以切换到mawk或gawk。苹果的基本系统包括一些古董。
Thomas Dickey'3

5

这是一个不会泄漏的perl等效项:

perl -lne 'BEGIN { @a=(0,2,4,5,7,9,11,12);}
   for ($i = 0; $i < 1; $i+= 0.0001) {
     printf("%08X\n", 100*sin(1382*exp($a[$F[0] % 8]/12)*log(2))*$i) }'

几乎一样。$1被替换$F[0]i替换$i。哈希a将替换为实际数组@a

您最好生成一些输入并比较输出并注意两者之间的差异。关于解释语言如何处理浮点数,通常会有细微差别。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.