当前位置: 首页 > 知识库问答 >
问题:

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

苗盛
2023-03-14

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”很小的情况下运行良好。

但是当“单词对.txt”html" target="_blank">文件大约有140,000行(每行,两个单词)时,它的运行非常非常慢。它不能自己完成,即使在运行20秒后也是如此。

它有什么问题?代码中是否有任何错误??感谢任何人的帮助!

代码(目前,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代码只花费了大约160ms),但是比我原来的旧Perl6代码好得多。:)

PS。整个东西,包括原始测试代码、补丁和示例文本,都在github上。

共有2个答案

尤茂材
2023-03-14

Rakudo并不以其出色的表现而闻名。

使用更惯用的代码可能有帮助,也可能没有帮助:

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

您还可以检查其他后端(Rakudo在MoarVM,鹦鹉和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';

我相信如果你想自己深入研究这个问题,也可以使用一个剖析器。

蒋高超
2023-03-14

我用一个包含10,000行的文件,用与Christoph非常相似的代码对此进行了测试。这大约需要15秒,正如你所说的,比Perl 5慢得多。我怀疑这段代码很慢,因为这段代码使用的一些东西没有像Rakudo和MoarVM的其他部分最近得到的那样多的优化工作。我确信在接下来的几个月里,代码的性能将会得到显著的提高,因为无论什么东西慢都会得到更多的关注。

当试图确定某些Perl 6代码速度慢的原因时,我建议使用--profile在MoarVM上运行perl6,看看它是否有助于找到瓶颈。不幸的是,这段代码将指向rakudo内部,而不是您可以改进的任何东西。

当然值得在irc.freenode上与#perl6讨论。net,因为他们将有知识提供替代解决方案,并将能够在未来提高其性能。

 类似资料:
  • 我使用的是Guidewire开发工作室(基于IntelliJ的IDE),在处理大文本文件(~1500行及以上)时速度非常慢。我也尝试了一个开箱即用的社区IntelliJ,但遇到了同样的问题。 当我打开这些文件时,键入一个字符需要 1 秒,即使我清楚地看到使用的内存仍然足够 (1441 MB/3959 MB)。此外,如果我打开多个文件,它会迅速吸收所有内存(我只为 IntelliJ 分配 4GB)。

  • 此代码检查一个5.1GB的大型文本文件,并检查是否有出现少于100次的单词。然后将5.1GB重写到输出文本文件中,并将这些单词替换为unk。主要问题是创建output.txt需要很长时间。我怀疑方法write_text()打开数据集文件和输出文件的方式会导致问题。 这个脚本背后的目标是:我有一个预构建的vocab和一个文本。这篇课文可能有新单词不在我的词汇表中,所以我想把它们添加到我的词汇表中。但

  • 问题内容: 我正在使用Java为某些文件生成MD5哈希。我需要为多个文件生成一个MD5,总大小约为1 GB。这是我的代码: } 这似乎永远存在。如何提高效率? 问题答案: 您可能要使用Fast MD5 库。它比Java内置的MD5提供程序快得多,并且获取哈希的过程非常简单: 请注意,速度较慢也可能是由于文件I / O速度较慢所致。

  • 问题内容: 我有一个很大的xml文件,其中包含许多子元素。我希望能够运行一些xpath查询。我尝试在Java中使用vtd- xml,但有时会出现内存不足错误,因为xml太大,无法容纳到内存中。是否有替代方法来处理如此大的xml。 问题答案: 尝试http://code.google.com/p/jlibs/wiki/XMLDog 它使用sax执行xpaths,而无需创建xml文档的内存表示形式。

  • 问题内容: 我正在尝试处理较大的(可能多达200M)JSON文件。文件的结构基本上是对象数组。 因此,遵循以下原则: 每个对象都具有任意属性,不必与数组中的其他对象共享它们(例如,具有相同的属性)。 我想对数组中的每个对象进行处理,并且由于文件可能很大,因此无法将整个文件内容都包含在内存中,无法解码JSON并遍历PHP数组。 因此,理想情况下,我想读取文件,为每个对象获取足够的信息并进行处理。如果

  • 问题内容: 我在Java应用程序中使用Hibernate访问我的数据库,它与MS- SQL和MySQL配合得很好。但是我必须以某种形式显示的某些数据必须来自文本文件,对于文本文件,我的意思是人类可读文件,它们可以是CSV,制表符分隔甚至是键,值对,每行,因为我的数据就这么简单,但是我的首选当然是XML文件。 我的问题是:我可以使用Hibernate通过HQL,Query,EntityManager