Raku में wc -l का अनुकरण कैसे करें


9

पर्ल 5 में, आप wc -lऑनलाइनर का उपयोग करके अनुकरण कर सकते हैं :

perl -lnE 'END {say $.}' test.txt

Raku पर इस कार्यक्षमता को कैसे लागू किया जाए

यदि आप इसे लागू करने का प्रयास करते हैं:

raku -e 'say "test.txt".IO.open.lines.elems'

यह धीमा हो जाता है और बहुत सारी मेमोरी का उपयोग करता है

पुन: पेश करने की जानकारी:

$ wget http://eforexcel.com/wp/wp-content/uploads/2017/07/1500000%20Sales%20Records.zip
$ unzip "1500000 Sales Records.zip"
$ mv "1500000 Sales Records.csv" part.txt
$ for i in `seq 1 10`; do cat part.txt >> test.txt ; done
$ du -sh test.txt
1.8G    test.txt

$ time wc -l test.txt
15000000 test.txt

real    0m0,350s
user    0m0,143s
sys     0m0,205s

$ time perl -lnE 'END { say $. }' test.txt
15000001

real    0m1,981s
user    0m1,719s
sys     0m0,256s

$ time raku -e 'say "test.txt".IO.open.lines.elems'
15000001

real    2m51,852s
user    0m25,129s
sys     0m6,378s

# Using swap (maximum uses 2.2G swap):
# Before `raku -e ''`

$ free -m
              total        used        free      shared  buff/cache   available
Mem:          15009        1695       12604         107         708       12917
Swap:          7583           0        7583

# After `raku -e ''`

$ free -m
              total        used        free      shared  buff/cache   available
Mem:          15009         752       13923          72         332       13899
Swap:          7583         779        6804

# Swap not used
$ time raku -ne '++$ andthen END .say' test.txt
15000001

real    1m44,906s
user    2m14,165s
sys     0m0,653s

$ raku -v
This is Rakudo version 2019.11 built on MoarVM version 2019.11
implementing Perl 6.d.

3
क्या आप समय की जानकारी और wc(जो फ़ाइल आकार शामिल होना चाहिए) का वास्तविक आउटपुट जोड़ सकते हैं । धन्यवाद।
एलिजाबेथ मैटीजसेन

अपडेट प्रश्न - पुन: पेश करने के लिए जोड़ा गया उदाहरण
TheAthlete

2
@ अतिरिक्त जानकारी के लिए धन्यवाद। मुझे लगता है कि संभावना है कि यह एक ऐतिहासिक रूप से दिलचस्प [raku] SO होगा क्योंकि राकोडो के आने वाले वर्षों में प्रदर्शन अंतराल के स्थिर स्थिर समापन के कारण, इसलिए कृपया कुछ और जानकारी के बिट्स जोड़ने पर विचार करें। सबसे पहले, हालांकि यह स्पष्ट है कि आप हाल ही में एक rakudo का उपयोग कर रहे हैं (क्योंकि आप लिख रहे हैं raku) यह अभी भी raku -vआउटपुट के लिए अच्छा होगा । इसके अलावा, कृपया मेरे वर्तमान सुझाव के समय के आउटपुट को जोड़ने पर विचार करें। इसके अलावा, मैं 'ascii'एक बेहतर समय का उत्पादन करने के लिए इस सप्ताह के अंत में डिकोडर पर स्विच कर सकता हूं ।
raiph

1
एक साइड नोट पर: -lपर्ल के लिए झंडा पर्ल को काफी धीमा कर देता है और यह इस मामले में उपयोगी नहीं है। यादृच्छिक लाइन की लंबाई और लगभग 200k लाइनों वाली फ़ाइल के लिए मेरी मशीन पर, -l40% सुधार के परिणाम निकालते हैं ।
सोरिन

जवाबों:


8

एक विकल्प जो अभी भी तुलनात्मक रूप से धीमा होने की संभावना है perlलेकिन तुलना करने लायक है:

raku -ne '++$ andthen END .say' test.txt

lआदेश पंक्ति विकल्प अनावश्यक है।

$ एक अनाम राज्य स्केलर है।

andthenपरीक्षण जो इसके lhs परिभाषित करता है, और यदि ऐसा है, तो उस मान को विषय ( $_) के रूप में सेट करता है और फिर उसके rhs का मूल्यांकन करता है।

ENDके समान है perlकी END। ध्यान दें कि यह वापस लौटता Nilहै, andthenलेकिन यहां कोई फर्क नहीं पड़ता क्योंकि हम ENDइसके साइड-इफेक्ट के लिए स्टेटमेंट का उपयोग कर रहे हैं ।

कई चीजें इस कोड की गति को प्रभावित करेंगी। कुछ चीजें जो मैं सोच सकता हूं:

  • कंपाइलर स्टार्टअप ओवरहेड। उपयोग किए जा रहे किसी भी मॉड्यूल को अनदेखा करते हुए, rakuकंपाइलर राकूडो के पास एक सामान्य नगण्य एक की तुलना में ठेठ हार्डवेयर पर एक सेकंड के दसवें के बारे में एक स्टार्टअप ओवरहेड है perl

  • एक "लाइन" की धारणा। में perl, लाइन प्रोसेसिंग की डिफ़ॉल्ट धारणा बाइट्स की एक श्रृंखला को पढ़ रही है, जिनमें से कुछ लाइन अंत का प्रतिनिधित्व करते हैं। में raku, लाइन प्रोसेसिंग की डिफ़ॉल्ट धारणा UTF-8 स्ट्रिंग पढ़ रही है, जिनमें से कुछ लाइन अंत का प्रतिनिधित्व करती हैं। इस प्रकार perlकेवल एक ASCII (या विस्तारित ASCII) डिकोडर rakuके रीडिंग ओवरहेड को उकसाता है जबकि एक UTF-8 डिकोडर के रीडिंग ओवरहेड को इंक्रीज करता है।

  • संकलक अनुकूलन। perlआम तौर पर अधिकतम के लिए अनुकूलित है। यह मुझे आश्चर्य नहीं होगा अगर perl -lnE 'END {say $.}' test.txtकुछ चतुर अनुकूलन का लाभ लेता है। इसके विपरीत, Rakudo अनुकूलन पर काम अभी भी अपने शुरुआती दिनों में अपेक्षाकृत बोल रहा है।

केवल एक चीज जो मुझे लगता है कि किसी ने भी ऊपर उल्लेखित तीन बिंदुओं के पहले और आखिरी के बारे में कर सकते हैं, एन साल की प्रतीक्षा करने और / या संकलक के सुधार में योगदान करने के लिए हैं।

राकू के UTF-8-बाय-डिफॉल्ट के आसपास काम करने का एक तरीका होगा। शायद रकु के डिफ़ॉल्ट की तुलना में निम्नलिखित जैसा कुछ पहले से ही संभव है और काफी तेज है, कम से कम एक मॉड्यूल के उपयोग के ओवरहेड को अनदेखा करना foo:

raku -Mfoo -ne '++$ andthen END .say' test.txt

जहां मॉड्यूल fooफ़ाइल I / O के लिए डिफ़ॉल्ट एन्कोडिंग को ASCII या जो भी उपलब्ध एन्कोडिंग से स्विच करता है ।

मैंने जाँच नहीं की है कि यह वास्तव में वर्तमान Rakudo में उल्लेखनीय है, लेकिन आश्चर्य नहीं होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.