Regex perl脚本消耗100%的cpu

Regex perl脚本消耗100%的cpu,regex,linux,perl,gdb,Regex,Linux,Perl,Gdb,我有一个perl脚本,它通过一些mysql连接来触发select查询。 我使用DBI perl模块来做同样的事情 有时它消耗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

我有一个perl脚本,它通过一些mysql连接来触发select查询。 我使用DBI perl模块来做同样的事情

有时它消耗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)

有时一个regexp处理可能会花费很长时间,即使数据量适中

假设您有这样一个regexp:

my $data =~ s!.*findit:(.+)!$1!gis;
此regexp执行相同的操作,但速度要快得多:

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

看起来它在处理正则表达式。类似这样的东西可以告诉您它在Perl代码中的什么位置被卡住了吗?好吧,您可以仔细查看代码,可能会搜索绑定到非常大数据的
s///
替换,或者可能会严重回溯。正常的回溯级别太低,无法提供有用的数据(这里只告诉我们哪个Op正在运行)。请包括正在执行的代码,尤其是正则表达式。首先,使用100%的CPU不是问题。这其实是件好事。这意味着没有浪费CPU。在我看来,你实际上是在抱怨打电话太长了。你想让我们怎么办?我们无法提供替代方案,因为您没有说明您正在尝试做什么。我们无法帮助您调试它,因为您没有提供任何要调试的内容。请将此作为注释重新发布:根据迄今为止提供的少量信息,我的第一个猜测是您有一个regex犯了以下错误。“有时一个regexp处理可能需要一段时间”不正确:我想回想一下,在50次不使用字符的操作之后,Perl正则表达式引擎中止。此外,除非通过回溯,否则不能减少字符串中的位置。因此,每个正则表达式都终止。但是,正则表达式的编写方式可能会导致过度回溯(例如,使用许多
量词或贪婪匹配)。您的示例没有演示这一点,可以编写为
s/\A.*i:findit:(?=)//s
如果您想避免不必要的捕获。thnx user1126070,它非常有用。我在生产脚本中遇到了这个问题,所以至少在过去几年(5.8年初,5.6年末)是这样的