我意识到我的awk
脚本随着时间的推移越来越多地使用内存,当时我不打算将任何内容存储在内存中,所以我决定做一些测试。
这是一个非常简单的脚本(我的更大,但我在一个非常基本的问题上重现了这个问题)。我的awk
脚本在bash
脚本中使用,$file
变量是awk
运行的文件。
awk '
{
if(match($0,"word"))
{
line=substr($0, RSTART - 20, RLENGTH + 20)
print line
}
}
' "$file"
如果我在一个大文件上执行此脚本,其中每行包含word
,awk
脚本的内存使用率会提高,如果我打印到文件,速度会更快。我必须在它冻结我的电脑之前停止它。你知道造成这种大内存使用的原因吗?
在我的真实脚本中,文件通常较小,并且match
函数不会像这个函数那样触发每一行,但我宁愿确保不会发生任何错误。
编辑:这个问题在使用mawk时似乎没有出现,只有GNU awk,我不知道为什么。
答案 0 :(得分:0)
尝试这种替代方案
awk '
/word/ {
# you can match here, if result of operation is needed for later action
print "hello"
}
' "$file"
匹配每一行诱导一些更多的计算,比如定义最长出现的索引(测试很多可能性),...所以是的,它是文件大小的指数(和内部的行大小)
如果匹配是一个无法与周围代码分开的条件部分,至少使用index()代替match()(或者更好if( $0 ~ /word/)
,如果不是其他结果,那么检查存在是目标)
答案 1 :(得分:0)
使用mawk时,似乎没有出现问题,只有GNU awk才会出现。
我在LC_ALL=C
脚本之前使用awk
来解决问题,如下所示:
LC_ALL=C awk '
{
if(match($0,"word"))
{
line=substr($0, RSTART - 20, RLENGTH + 20)
print line
}
}
' "$file"
编辑:问题并没有出现在GNU awk 4.1.4上。这似乎只发生在旧版本(我的是3.1.3)