রকুতে কীভাবে ডাব্লুসি-এল অনুকরণ করবেন


9

পার্ল 5 এ, আপনি wc -lঅনেলাইনার ব্যবহার করে অনুকরণ করতে পারেন :

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

রাকুর উপর এই কার্যকারিতাটি কীভাবে প্রয়োগ করা যায়

আপনি যদি এটি বাস্তবায়নের চেষ্টা করেন:

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(যার মধ্যে ফাইলের আকার অন্তর্ভুক্ত হওয়া উচিত) যোগ করতে পারেন? ধন্যবাদ.
এলিজাবেথ ম্যাটিজসেন

আপডেট প্রশ্ন - পুনরুত্পণের জন্য যুক্ত উদাহরণ
দ্য অ্যাথলিট

2
যোগ করা তথ্যের জন্য @ অ্যাটলিট ধন্যবাদ। আমি মনে করি এটি সম্ভবত historতিহাসিকভাবে আকর্ষণীয় হবে [রাকু] এসইও কারণ আসন্ন বছরগুলিতে রাকুদোর পারফরম্যান্সের ব্যবধানটি অবিচ্ছিন্নভাবে বন্ধ হয়ে যাওয়ার কারণে দয়া করে আরও কয়েকটি বিট তথ্য যোগ করার বিষয়টি বিবেচনা করুন। প্রথমত, যদিও এটি স্পষ্ট হয়েছে আপনি সাম্প্রতিক একটি রকুডো ব্যবহার করছেন (কারণ আপনি লিখছেন raku) তবে raku -vআউটপুট রাখা ভাল হবে । এছাড়াও, দয়া করে আমার বর্তমান পরামর্শের সময় আউটপুট যুক্ত বিবেচনা করুন। এছাড়াও, আমি 'ascii'আরও ভাল সময় তৈরি করতে এই উইকএন্ডের শেষে ডিকোডারের দিকে যেতে চাই ।
রায়ফ

1
পার্শ্ব নোটে: -lপার্লের পতাকাটি পার্লটিকে উল্লেখযোগ্যভাবে ধীর করে দেয় এবং এটি এই ক্ষেত্রে কার্যকর নয়। এলোমেলো লাইন দৈর্ঘ্য এবং প্রায় 200k লাইনযুক্ত ফাইলের জন্য আমার মেশিনে, -l40% উন্নতিতে ফলাফল সরিয়ে ।
সোরিন

উত্তর:


8

একটি তুলনামূলক তুলনায় তুলনামূলক তুলনায় এখনও বেশ ধীর হতে পারে এমন একটি বিকল্প perl:

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

lকমান্ড লাইন বিকল্প অপ্রয়োজনীয়।

$ একটি বেনামি রাষ্ট্র স্কেলার।

andthenপরীক্ষা করে যে এর lhs সংজ্ঞায়িত করা হয়েছে, এবং যদি থাকে তবে সেই মানটিকে বিষয় ( $_) হিসাবে সেট করে এবং তার পরে আরএইচএস মূল্যায়ন করে।

ENDঅনুরূপ perl'র END। মনে রাখবেন যে ফেরৎ Nilকরতে andthenকিন্তু যে বিষয়টি এখানে কারণ আমরা ব্যবহার করছি না ENDতার পার্শ্ব প্রতিক্রিয়া 's বিবৃতি।

বেশ কয়েকটি জিনিস এই কোডের গতিতে প্রভাব ফেলবে। কিছু বিষয় যা আমি ভাবতে পারি:

  • সংকলক সূচনা ওভারহেড। যে কোনও মডিউল ব্যবহার করা হচ্ছে তা উপেক্ষা করে, rakuসংকলক রাকুডোতে মোটামুটি তুচ্ছ-এর তুলনায় সাধারণ হার্ডওয়ারের সেকেন্ডের প্রায় দশমাংশের একটি স্টার্টআপ ওভারহেড থাকে perl

  • একটি "লাইন" ধারণা। ইন perl, লাইন প্রসেসিংয়ের ডিফল্ট ধারণাটি বাইটের একটি সিরিজ পড়ছে, যার মধ্যে কয়েকটি লাইন শেষের প্রতিনিধিত্ব করে। ইন raku, লাইন প্রসেসিংয়ের ডিফল্ট ধারণাটি একটি ইউটিএফ -8 স্ট্রিং পড়ছে, যার মধ্যে কয়েকটি লাইন শেষের প্রতিনিধিত্ব করে। সুতরাং perlকেবলমাত্র একটি ASCII (বা বর্ধিত এএসসিআইআই) ডিকোডারের rakuরিডিং ওভারহেড অন্তর্ভুক্ত হয় যেখানে কোনও ইউটিএফ -8 ডিকোডারের রিডিং ওভারহেড অন্তর্ভুক্ত থাকে।

  • সংকলক অপ্টিমাইজেশন। perlসাধারণত সর্বোচ্চটি অনুকূলিত হয়। perl -lnE 'END {say $.}' test.txtকিছু চতুর অপ্টিমাইজেশানের সুবিধা নিলে আমার অবাক করা হবে না । বিপরীতে, রাকুডো অপ্টিমাইজেশনের কাজ তুলনামূলকভাবে বলতে গেলে তার প্রথম দিনগুলিতে এখনও রয়েছে।

আমি উপরে উল্লিখিত তিনটি পয়েন্টের মধ্যে প্রথম এবং শেষ সম্পর্কে যে কেউ কেবলমাত্র করতে পারে বলে মনে করি তা হল N বছর অপেক্ষা করা এবং / অথবা সংকলকের উন্নতিতে অবদান রাখা।

রাকুর ইউটিএফ-8-বাই-ডিফল্টকে ঘিরে কাজ করার একটি উপায় থাকবে। রাকুর ডিফল্টের চেয়ে নীচের মতো কিছু ইতিমধ্যে করণীয় এবং উল্লেখযোগ্যভাবে দ্রুত, কমপক্ষে একটি মডিউল নামক মডিউলটি ব্যবহারের ওভারহেড উপেক্ষা করে foo:

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

যেখানে মডিউল fooফাইল I / O এর জন্য ডিফল্ট এনকোডিং এএসসিআইআই বা উপলব্ধ এনকোডিংগুলি থেকে যা কিছু পরিবর্তন করে

আমি এটি পরীক্ষা করে দেখিনি যে এটি বর্তমান রাকুডোতে প্রকৃতপক্ষে করণীয় তবে তা না হলে অবাক হবেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.