গ্রেপ-ই, শেড-ই - '[x] {1,9999}' ব্যবহার করা হয় যখন কম পারফরম্যান্স, তবে কেন?


9

যখন grepবা sedবিকল্প ব্যবহার করা হয় --extended-regexpএবং প্যাটার্ন {1,9999}regexp যে ব্যবহার করা হয় এর একটি অংশ এসব কমান্ড কর্মক্ষমতা কম হয়ে যায়। আরও পরিষ্কার হতে, নীচে কয়েকটি পরীক্ষা প্রয়োগ করা হয়েছে। [১] [২]

  • আপেক্ষিক কর্মক্ষমতা grep -E, egrepএবং sed -Eপ্রায় সমান, তাই শুধুমাত্র পরীক্ষা যে দিয়ে তৈরি হয়েছে grep -Eপ্রদান করা হয়।

পরীক্ষা 1

$ time grep -E '[0-9]{1,99}' < /dev/null

real    0m0.002s

পরীক্ষা 2

$ time grep -E '[0-9]{1,9999}' < /dev/null

> real    0m0.494s

পরীক্ষা 3

$ সময় গ্রেপ-ই '[0123456789] {1,9999 <' </ দেব / নাল

> আসল 21m43.947s

পরীক্ষা 4

$ time grep -E '[0123456789]+' < /dev/null
$ time grep -E '[0123456789]*' < /dev/null
$ time grep -E '[0123456789]{1,}' < /dev/null
$ time grep -P '[0123456789]{1,9999}' < /dev/null

real    0m0.002s       

পারফরম্যান্সের এই তাত্পর্যপূর্ণ পার্থক্যের কারণ কী?


3
এটি একটি আকর্ষণীয় পর্যবেক্ষণ - আমার অনুমান যে পার্স গাছটি কীভাবে তৈরি করছে ঠিক এটির জন্য আপনাকে [0-9]+
গ্রেপের

3
ইনপুট কোন ব্যাপার না। @Steeldriver বোঝা যায়, মন্দার আগে বসেছে মিলে। একটি সহজ পরীক্ষা time grep -E '[0-9]{1,99}' </dev/nullবনাম time grep -E '[0-9]{1,9999}' </dev/null। এমনকি কোনও ইনপুট ছাড়াই , দ্বিতীয় কমান্ডটি ধীর গতিতে (16.04 এ)। যেমনটি প্রত্যাশিত, বাদ দেওয়া -Eএবং পালানো {এবং }একই আচরণ করে এবং এর সাথে প্রতিস্থাপন -Eকরা -Pধীর নয় (পিসিআরআই একটি আলাদা ইঞ্জিন)। সবচেয়ে আকর্ষণীয় কত হয় দ্রুত [0-9] চেয়ে ., x, এবং এমনকি [0123456789]। এর মধ্যে যে কোনওটি এবং {1,9999}, grepপ্রচুর পরিমাণে র‍্যাম গ্রহণ করে; আমি এটি 10 ​​মিনিটেরও বেশি চালিয়ে যেতে সাহস করি না।
এলিয়াহ কাগান

3
@ нιηসнιη না, { }এগুলি ' 'উদ্ধৃত হয়েছে ; শেল তাদের অপরিবর্তনীয় পাস grep। যাইহোক, {1,9999}একটি খুব দ্রুত এবং সাধারণ ব্রেস সম্প্রসারণ হবে । শেলটি কেবল এটিতে প্রসারিত হবে 1 9999
এলিয়াহ কাগান

4
@ .sнιη আপনি কী বলতে চাইছেন তা আমি পুরোপুরি জানি না, তবে শেলের সাথে এটির অবশ্যই কোনও সম্পর্ক নেই। দীর্ঘকাল চলমান কমান্ড চলাকালীন, আমি ব্যবহার করেছি psএবং topযাচাই করার জন্য grepপ্রত্যাশিত যুক্তিগুলি পাস হয়ে গেছে এবং এটি bashপ্রচুর র‍্যাম এবং সিপিইউ গ্রহণ করে না। আমি প্রত্যাশা করি grepএবং sedউভয়ই বিআরই / ইআর ম্যাচিংয়ের জন্য লিবিকায় প্রয়োগ করা পসিক্স রেজেক্স ফাংশন ব্যবহার করে ; বিকাশকারীরা সেই লাইব্রেরিটি ব্যবহার করা বেছে নিয়েছিল বলে ইনসফার ব্যতীত আমার সত্যই নকশার বিষয়ে বিশেষভাবে কথা বলা উচিত ছিল না । grepgrep
এলিয়াহ

3
আমি আপনাকে পরামর্শ দিয়েছি যে আপনি পরীক্ষাগুলি এর সাথে প্রতিস্থাপন করুন time grep ... < /dev/null, যাতে লোকেদের খাওয়ানো ডেটা grepএবং অন্যান্য বহিরাগত জিনিসগুলির সাথে প্রকৃত সমস্যাটির সংঘাত না ঘটে ।
মুরু

উত্তর:


10

নোট করুন যে এটি ম্যাচের জন্য সময় নেয় না, তবে আরই আর বিল্ডিং। আপনি দেখতে পাবেন যে এটিতে প্রচুর র‍্যাম ব্যবহার করা হয়েছে:

$ valgrind grep -Eo '[0-9]{1,9999}' < /dev/null
==6518== HEAP SUMMARY:
==6518==     in use at exit: 1,603,530,656 bytes in 60,013 blocks
==6518==   total heap usage: 123,613 allocs, 63,600 frees, 1,612,381,621 bytes allocated
$ valgrind grep -Eo '[0-9]{1,99}' < /dev/null
==6578==     in use at exit: 242,028 bytes in 613 blocks
==6578==   total heap usage: 1,459 allocs, 846 frees, 362,387 bytes allocated
$ valgrind grep -Eo '[0-9]{1,999}' < /dev/null
==6594== HEAP SUMMARY:
==6594==     in use at exit: 16,429,496 bytes in 6,013 blocks
==6594==   total heap usage: 12,586 allocs, 6,573 frees, 17,378,572 bytes allocated

বরাদ্দ সংখ্যা পুনরাবৃত্তির সংখ্যার সাথে আনুপাতিক আনুপাতিক বলে মনে হয়, তবে বরাদ্দকৃত মেমরিটি দ্রুত বৃদ্ধি পেতে পারে বলে মনে হয়।

এটি GNU regexps কীভাবে প্রয়োগ করা হয় তার নিচে। আপনি গনুহ কম্পাইল তাহলে grepসঙ্গে CPPFLAGS=-DDEBUG ./configure && make, এবং যারা কমান্ড সঞ্চালন করুন, আপনি ক্রিয়াটি সূচকীয় প্রভাব দেখতে পাবেন। তার থেকে আরও গভীরতর অর্থ ডিএফএর উপর প্রচুর তত্ত্বের মধ্য দিয়ে যাওয়া এবং গনুলিব রিজেক্সেপ বাস্তবায়নে ডুব দেওয়া।

এখানে, আপনি পরিবর্তে পিসিআরই ব্যবহার করতে পারেন যা একই সমস্যা বলে মনে হচ্ছে না: grep -Po '[0-9]{1,65535}'(সর্বাধিক, যদিও আপনি সর্বদা [0-9](?:[0-9]{0,10000}){100}1 থেকে 1,000,001 পুনরাবৃত্তির মতো কাজ করতে পারেন ) এর চেয়ে বেশি সময় বা স্মৃতি লাগে না grep -Po '[0-9]{1,2}'


এটিকে ঘিরে কাজ করার কোনও উপায় আছে কি?
সের্গেই কোলোডিয়াঝনি 21

3
@ সার্জি কলোডিএজনি, আপনি এমন ব্যবহার করতে পারেন grep -Po '[0-9]{1,9999}যা মনে হয় না সমস্যা আছে।
স্টাফেন চেজেলাস

1
এটি কেবলমাত্র sed -Eবা কেবলই নয় grep -E, এর awkমধ্যেও এই কম কর্মক্ষমতা রয়েছে (শেষ awk কমান্ড সম্পর্কে)। হয়তো awkআরো PCRE ব্যবহার করতে পারছি না?
нιηসнιη
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.