大きなテキストファイルを使用しているため、アルゴリズムの設計に大きな問題があります。単語のシーケンスを含むテキストファイルがあります。例えば
- 私の友人
- こんにちは私の友人
- 世界
2番目のファイルは文を含む大きな(ギガバイト)です。プログラムの目標は、単語(最初のファイル)を単語ごとに調べ、2番目のファイルで記号「+」を連結することです。
たとえば、入力として「hello my friendsoftheworld」「「hello+my + friends of the+world 」になる」
何かアイデアをお願いしますか?私はそれをPerlでプログラムしたいのですが、テキストでパフォーマンスがあります
私はこのスクリプトをPerlで実行しましたが、ファイルを何度も読み取るために遅すぎます.. :(これはPerlプログラムの例であり、機能しますが、遅すぎます
use strict;
use warnings;
use utf8;
use feature qw(:5.10);
my ($in, $dico) = @ARGV;
die "Bad infile $in" if !-r $in;
die "Bad dicofile $dico" if !-r $dico;
# load dico
my @dico;
open(FICHIERNOUVELLES, ">resultat7.txt");
open my $DICO, "<", $dico or die "Can't open $dico for reading: $!\n";
# For all lines in the Dico
foreach my $line (<$DICO>) {
chomp($line);
# extract words
if (my @word = split /\s+/, $line) {
my $re = q{(^\s*|\s+)(}.(join q(\s+), map quotemeta, @word).q{)(\s+|\s*$)};
push @dico, qr/$re/;
}
}
open my $IN, "<", $in or die "Can't open $in for reading: $!\n";
my @word;
foreach my $line (<$IN>) {
foreach my $dico (@dico) {
while (my (undef, $sequence) = $line =~ /$dico/) {
$sequence =~ s/\s+/+/g;
$line =~ s/$dico/$1$sequence$3/;
}
}
print FICHIERNOUVELLES "$line";
}
close(FICHIERNOUVELLES);