2015-12-28 17 views
5

私はPerl 6と並行処理/並行処理を同時に学習しようとしています。Perl 6での単純な並列処理の例が必要

簡単な学習の練習として、私は550の.htmファイルのフォルダを持っており、それらの中でコードの行の合計が必要です。これまでのところ、私はこれを持っています:

use v6; 

my $start_time = now; 
my $exception; 
my $total_lines = 0; 

my @files = "c:/testdir".IO.dir(test =>/'.' htm $/); 
for @files -> $file { 
    $total_lines += $file.lines.elems; 
    CATCH { 
     default { $exception = $_; } #some of the files error out for malformed utf-8 
    } 
} 
say $total_lines; 
say now - $start_time; 

これは約3秒で合計577,449になります。

Perl 6の並列化のアイデアを利用するにはどうすればよいでしょうか?救われた時間はそれほどではないが、それは概念の証明として働くだろうと分かっている。

+3

何か? – Christoph

+0

.raceでは平均して約2秒かかりました。 .raceがなければ、平均で2.6秒かかります。 – Herby

答えて

-1
use v6; 
my $start_time = now; 
my $exception; 
my @lines; 
my $total_lines = 0; 

my @files = "c:/testdir".IO.dir(test =>/'.' htm $/); 
await do for @files -> $file { 
    start { 
     @lines.push($file.lines.elems); 
     CATCH { 
      default { $exception = $_; } #some of the files error out for malformed utf-8 
     } 
    } 
} 
$total_lines = [+] @lines; 
say $total_lines; 
say now - $start_time; 
+1

ありがとうございます。奇妙なことに、このコードを複数回実行すると、さまざまな$ total_linesが得られます。私は5回それを実行し、575967,575367,570325,574797,572222のカウントを得た。それを引き起こしているものとして任意のアイデア? – Herby

+0

まだ - 私はhttp://blogs.perl.org/users/pawel_bbkr_pabian/2015/09/asynchronous-parallel-and-dead-my-perl-6-daily-bread.htmlからそれを掘り起こしました。まだperl6がどのように動作するかを学んでいます。その$ total_linesの更新の周りにロックの形式が必要かどうかはわかりません。おそらく、ブロックに行数を返し、待ち時間の外に合計を合計するとします。マップ/縮小スタイル。 –

+0

Ok - 並列コードの外で合計された配列内のelemsをキャプチャするために少し微調整しました。 –

1

Christophの提案を実装しています。私は今、encode latin1を使って不正な形式のUTF-8ファイルを読むことができるので、カウントは私の元のポストよりわずかに高いです。 .race` `ないものに比べて`、: `私の$ total_lines = [+] files.race.map @(ENC ).elems。*ライン()のような

use v6; 
my $start_time = now; 

my @files = "c:/iforms/live".IO.dir(test =>/'.' htm $/); 
my $total_lines = [+] @files.race.map(*.lines(:enc<latin1>).elems); 

say $total_lines; 

say now - $start_time; 
関連する問題