2015-12-28 20 views
5

Sto cercando di imparare Perl 6 e parallelismo/concorrenza allo stesso tempo.È necessario un semplice esempio di parallelismo in Perl 6

Per un semplice esercizio di apprendimento, ho una cartella di 550 file ".htm" e voglio la somma totale di righe di codice tra tutti loro. Finora, ho questo:

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; 

Che dà una somma di 577,449 in circa 3 secondi.

Come potrei riscriverlo per sfruttare le idee di parallelismo di Perl 6? Mi rendo conto che il tempo risparmiato non sarà molto, ma funzionerà come prova del concetto.

+3

qualcosa come 'i miei $ total_lines = [+] @ files.race.map (* linee (:. ENC ) .elems)', rispetto a quello senza '.race'? – Christoph

+0

Grande. Con .race ci sono voluti circa 2 secondi in media. Senza .race, ci vogliono in media 2,6 secondi. – Herby

risposta

-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

Grazie. Stranamente, quando eseguo questo codice più volte ottengo una varietà di $ total_lines. L'ho eseguito 5 volte e ho ottenuto i conteggi di: 575967, 575367, 570325, 574797, 576222. Qualche idea su cosa lo sta causando? – Herby

+0

Non ancora - L'ho fatto su da http://blogs.perl.org/users/pawel_bbkr_pabian/2015/09/asynchronous-parallel-and-dead-my-perl-6-daily-bread.html - e sono ancora imparando come tutto funziona perl6. Non so se hai bisogno di un qualche tipo di blocco attorno all'aggiornamento totale $ - forse se fai in modo che il blocco restituisca il numero di linee e sommi i totali al di fuori dell'attesa. mappa/riduci lo stile. –

+0

Ok - l'ha ritoccato un po 'per usare l'acquisizione degli elem in array che è sommata al di fuori del codice parallelo. –

1

Implementazione del suggerimento di Christoph. Il conteggio è leggermente superiore al mio post originale perché ora sono in grado di leggere i file UTF-8 malformati usando la codifica latin1.

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; 
Problemi correlati