regex - 为什么我的 Perl 正则表达式使用这么多内存?

标签 regex perl memory-management

我正在对一个大标量运行正则表达式。虽然这场比赛没有捕捉到任何东西,但我的进程在这场比赛之后增长了 30M:

# A
if (${$c} =~ m/\G<<\s*/cgs)
{
    #B
    ...
}
$c是对一个相当大的标量(大约 21M)的引用,但我已经验证了 pos(${$c})在正确的位置,表达式匹配第一个字符,pos(${$c})比赛结束后更新到正确的位置。但正如我所提到的,这个过程在#A 和#B 之间增长了大约 30M,即使我没有用这场比赛捕捉到任何东西。我的内存去哪儿了?

编辑:是的,使用 $&是罪魁祸首。我们使用的是 Perl 5.8.8,而我的脚本使用的是 Getopt::Declare , 它使用内置的 Text::Balanced .该模块的 1.95 版本使用了 $& . Perl 5.10 附带的 2.0.0 版本删除了对 $& 的引用。并缓解问题。

最佳答案

只是快速检查一下,您是否在代码中的任何位置提到了 $&、$` 或 $'(有时称为 $MATCH、$PREMATCH 和 $POSTMATCH)?如果是这样,Perl 将为每个正则表达式匹配复制整个字符串,以防万一你想检查这些变量。

在这种情况下,“在你的代码中”是间接的,包括使用引用这些变量的模块,或者写 use English而不是 use English qw( -no_match_vars ) .

如果不确定,可以使用 Devel::SawAmpersand模块来确定它们是否已被使用,以及 Devel::FindAmpersand找出它们的用途。

内存增加可能还有其他原因(您使用的是哪个版本的 Perl?),但是如果使用匹配变量,它们肯定会破坏您的内存,因此可能是罪魁祸首。

干杯,

保罗

关于regex - 为什么我的 Perl 正则表达式使用这么多内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/165660/

相关文章:

c++ - std::regex 转义在正则表达式中使用的特殊字符

c# - 在点上拆分字符串,但不在圆括号内的点上拆分

perl - 在 perl 中,这些没有印记的变量是什么?

c++ - 如果我的 C++ “new” 内存分配失败,如何找出返回值?

Python内存泄漏

Java GC高,如何找出哪些对象被GC了

javascript - 如何在 javascript 对象上进行匹配和替换

perl - 将 STDERR 重定向到 select()ed STDOUT

perl - 如何在 Perl 中使用 BOM 编码检测 UTF8

Python:大文件上的正则表达式。简单的方法?