我正在使用最新版本的marpa :: r2(Marpa-R2-2.065_002),它似乎很快耗尽了所有内存。我写了下面的脚本来测试它。

use strict;
use warnings FATAL => 'all';
use Marpa::R2;
use Data::Dumper;

my $grammar = Marpa::R2::Scanless::G->new({
 action_object => __PACKAGE__,
 source => \(<<'END_OF_SOURCE'),
 :default ::= action => ::array
 :start ::= path
 path ::=
  step               action => _do_step
 step ~ [a-z]+
END_OF_SOURCE
});

sub _do_step{ return {step => $_[1]}};


sub new {}     #The Marpa::R2 needs it
sub compile{
 my ($query) = @_;
 return undef unless $query;

 my $reader = Marpa::R2::Scanless::R->new({
  grammar => $grammar,
  trace_terminals => 0,
 });
 $reader->read(\$query);
 print Dumper $reader->value;
}

compile($_) foreach ('aaaa'..'zzzz');


如何防止内存泄漏?

编辑:现在报告为rt.cpan的错误。

编辑:现在已在版本Marpa-R2 2.066000中修复。谢谢

最佳答案

泄漏已在CPAN上的Marpa-R2 2.065_006中修复。感谢您指出这一点,并感谢amon的最小示例,它节省了我的时间并使事情变得更容易。

问题出在Perl代码中。两个结构相互引用-循环引用。用amon的示例测试固定版本会导致内存使用量随着时间的推移绝对保持稳定。

我将尽快将此修补程序放入CPAN上已编制索引的(非开发人员)发行版中。

08-27 04:09