2013-07-19 116 views
3

我有一个perl脚本,它执行一些mysql连接来触发选择查询。 我使用DBI perl模块来做同样的事情。Perl脚本消耗100%cpu

有时它会消耗100%cpu并且什么也不做。我得到了gdb对现场流程的回溯,同时它消耗了99%到100%的cpu。

#0 0x0000003990a7c680 in memcpy() from /lib64/libc.so.6 
#1 0x0000003992ae6e27 in Perl_regexec_flags() from /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/CORE/libperl.so 
#2 0x0000003992a922d5 in Perl_pp_subst() from /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/CORE/libperl.so 
#3 0x0000003992a8a39e in Perl_runops_standard() from /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/CORE/libperl.so 
#4 0x0000003992a37ecc in perl_run() from /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/CORE/libperl.so 
#5 0x00000000004017bc in main() 

我该怎么办? (我正在使用CentOS版本5.8(最终)kernel-2.6.18-308.el5)

+1

它看起来像它的处理正则表达式。像http://search.cpan.org/~jjore/App-Stacktrace-0.08/bin/perl-stacktrace这样的东西可以告诉你在Perl代码中它被卡住了吗? –

+4

那么,你仔细看看你的代码,可能会搜索绑定到非常大的数据或者可能会非常糟糕地回溯的''/''替换。正常的回溯信号太低而不能提供有用的数据(这里只告诉我们哪个运行正在运行)。 – amon

+2

请包含正在执行的代码,尤其是正则表达式。 – JDB

回答

1

有时正则表达式处理可能需要一个永远的时间,即使是中等数量的数据。

让说你有一个正则表达式是这样的:

my $data =~ s!.*findit:(.+)!$1!gis; 

这正则表达式做同样的,但它的速度要快得多:

my $data =~ s!\A.*findit:(.+)\z!$1!is; 
+0

*“有时正则表达式处理可能会永远”*错误:我想回想一下,在50个不消耗字符的操作之后,Perl正则表达式引擎会中止。而且,除了通过回溯之外,字符串中的位置不能减小。因此,每个正则表达式都会终止。然而,正则表达式可以用过度回溯的方式来编写(例如,使用许多'?'量词或者贪婪匹配)。你的例子没有证明这一点,如果你想避免不必要的捕获,可以写成's/\ A。*(?i:findit):(?=。)// s'。 – amon

+0

thnx user1126070,它非常有用。 – JohnG

+0

我在制作脚本中遇到了这个问题,至少在过去的几年前(5.8早,5.6晚) – user1126070