使用Perl6处理大型文本文件,速度过慢。(2014-09)

5

代码托管在https://github.com/yeahnoob/perl6-perf,如下所示:

use v6;

my $file=open "wordpairs.txt", :r;

my %dict;
my $line;

repeat {
    $line=$file.get;
    my ($p1,$p2)=$line.split(' ');
    if ?%dict{$p1} {
        %dict{$p1} = "{%dict{$p1}} {$p2}".words;
    } else {
        %dict{$p1} = $p2;
    }
} while !$file.eof;

在"wordpairs.txt"文件较小的情况下,运行良好。但当该文件包含约14万行(每行两个单词)时,运行速度变得非常慢。即使运行20秒后,它也无法完成自身。这是什么问题?代码有问题吗?感谢任何帮助!以下内容添加于2014-09-04,感谢SE Answers和IRC@freenode#perl6提出的许多建议。 代码(截至目前,2014-09-04):
my %dict;
grammar WordPairs {
token word-pair { (\S*) ' ' (\S*) "\n" }
token TOP { <word-pair>* }
}
class WordPairsActions {
method word-pair($/) { %dict{$0}.push($1) }
}
my $match = WordPairs.parse(slurp, :actions(WordPairsActions));
say ?$match;

现在的运行时间成本为:

$ time perl6 countpairs.pl wordpairs.txt
True
The pairs count of the key word "her" in wordpairs.txt is 1036

real    0m24.043s
user    0m23.854s
sys     0m0.181s

$ perl6 --version
This is perl6 version 2014.08 built on MoarVM version 2014.08

目前来看,这个测试的时间表现还不够合理(因为同样的 Perl 5 代码只需要约160毫秒),但比我原来的旧 Perl6 代码好多了。 :)

PS. 整个内容,包括原始测试代码、补丁和示例文本,都在 Github 上。

2个回答

3
我已测试了类似Christoph的代码,使用包含10,000行的文件进行测试。它需要约15秒钟时间,正如你所说,比Perl 5慢得多。我怀疑这段代码之所以慢是因为其中的一些部分没有像Rakudo和MoarVM的其他部分那样接受到优化的努力。我相信,在接下来的几个月里,随着缓慢的部分获得更多关注,代码的性能将有明显提高。

在尝试确定某些Perl 6代码为什么慢时,建议使用--profile选项在MoarVM上运行perl6,看看是否有助于找到瓶颈。不幸的是,对于这段代码,它会指向rakudo的内部而不是您可以改进的任何内容。

值得与irc.freenode.net上的#perl6交谈,因为他们将有知识提供替代方案,并且将能够在未来提高其性能。


2

Rakudo并不以其卓越的性能而著称。

使用更多惯用代码可能有助于提高性能,也可能无济于事:

my %dict;
for open('wordpairs.txt', :r).lines {
    my ($key, @words) = .words;
    push %dict{$key}, @words;
}

你也可以检查其他后端(Rakudo运行在MoarVM、Parrot和JVM上)以查看是否在所有地方都同样缓慢。


了解是IO还是处理速度缓慢也很有趣,例如通过

my %dict;

say 'start IO';
my @lines = eager open('wordpairs.txt', :r).lines;
say 'done IO';

say 'start processing';
for @lines { ... }
say 'done processing';

我相信如果你想自己深入探究这个问题,还有一个性能分析器可供使用。


使用JVM/Parrot/MoarVM进行测试,所有运行时间不少于60秒。(我没有等待它的运行结果,并在几分钟内没有任何响应后使用Ctrl+C停止了它。)我认为这里一定有BUG,因为几乎相同的Perl 5代码在我的电脑上只花费不到200毫秒。 - yeahnoob
自上次评论以来,Rakudo 在这个领域取得了巨大的进展,特别是在 MoarVM 上。您可能想重新查看这些基准测试。 - Elizabeth Mattijsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接