2015-12-28 30 views
5

में सरल समांतरता उदाहरण की आवश्यकता है, मैं एक ही समय में पर्ल 6 और समांतरता/समरूपता सीखने की कोशिश कर रहा हूं।पर्ल 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,44 9 की राशि देता है।

पर्ल 6 समांतरता विचारों का लाभ उठाने के लिए मैं इसे कैसे लिखूं? मुझे एहसास हुआ कि बचाया गया समय ज्यादा नहीं होगा लेकिन यह अवधारणा के सबूत के रूप में काम करेगा।

+3

कुछ 'मेरी $ total_lines = [+] @ files.race.map (* लाइनें (।: ENC ) .elems) जैसे', 'बिना .race' एक की तुलना में? – Christoph

+0

ग्रेट। .race के साथ औसत पर लगभग 2 सेकंड लग गए। बिना .्रेस के, औसत पर 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

धन्यवाद। अजीब बात यह है कि, जब मैं इस कोड को कई बार चलाता हूं तो मुझे $ कुल_लाइनों की एक किस्म मिलती है। मैंने इसे 5 बार भाग लिया और इसकी गणना हुई: 575 9 67, 575367, 570325, 574797, 576222. किसी भी विचार के कारण क्या हो रहा है? – Herby

+0

अभी तक नहीं - मैंने इसे http://blogs.perl.org/users/pawel_bbkr_pabian/2015/09/asynchronous-parallel-and-dead-my-perl-6-daily-bread.html - और मैं हूं अभी भी सीख रहा है कि कैसे perl6 सभी काम करता है। पता नहीं है कि आपको उस $ कुल_लाइन अपडेट के आसपास लॉकिंग के किसी भी रूप की आवश्यकता है - शायद यदि आप ब्लॉक को लाइनों की संख्या वापस कर देते हैं, और इंतजार के बाहर कुल योग पर योग करते हैं। मानचित्र/शैली को कम करें। –

+0

ठीक है - समानांतर कोड के बाहर समेकित सरणी में elems को कैप्चर करने के लिए इसे थोड़ा सा tweaked। –

1

क्रिस्टोफ के सुझाव को लागू करना। गिनती मेरी मूल पोस्ट से थोड़ी अधिक है क्योंकि अब मैं एनकोड लैटिन 1 का उपयोग करके विकृत यूटीएफ -8 फाइलों में पढ़ने में सक्षम हूं।

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; 
संबंधित मुद्दे