পার্লের গ্লোবের কি কোনও সীমাবদ্ধতা রয়েছে?


9

আমি নিম্নলিখিত 5 টি অক্ষরের রিটার্নিং স্ট্রিংটি চালাচ্ছি:

while (glob '{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z}'x5) {
  print "$_\n";
}

তবে এটি কেবল 4 টি অক্ষর প্রদান করে:

anbc
anbd
anbe
anbf
anbg
...

যাইহোক, যখন আমি তালিকার অক্ষরের সংখ্যা হ্রাস করি:

while (glob '{a,b,c,d,e,f,g,h,i,j,k,l,m}'x5) {
  print "$_\n";
}

এটি সঠিকভাবে ফিরে আসে:

aamid
aamie
aamif
aamig
aamih
...

কেউ কি দয়া করে আমাকে বলতে পারেন যে আমি এখানে কী মিস করছি, সেখানে কি কোনও প্রকার সীমাবদ্ধতা রয়েছে? বা এই কাছাকাছি কোন উপায় আছে?

যদি কোনো পার্থক্য করে তোলে, এটা উভয় একই ফলাফল ফেরৎ perl 5.26এবংperl 5.28


পূর্বে: স্ট্যাকওভারফ্লো. com/ a/ 58852104 স্ট্যাকওভারফ্লো. com/ a / 58853045 গ্লোব ফাংশনটি অপব্যবহারের পরিবর্তে পুনরুক্তি সরবরাহকারী মডিউলটি ব্যবহার করুন। p3rl.org/Algorithm :: কম্বিনেটরেটিকস
ডক্সিম

ধন্যবাদ @ ডেক্সিম। সমস্যাটি হ'ল আমি এখনই যেকোন ধরণের মডিউল লোড করার জন্য লড়াই করছি, আমার কাছে উইন 32 :: কনসোল সম্পর্কে অভিযোগ করা একটি সিপিএন ইস্যু রয়েছে, তবে পিপিএম পার্ল 5.28 তে পাওয়া যায় না তাই আমি অভিযোগ বন্ধ করতে সিপিএন-র জন্য মডিউলটি লোড করতে পারি।
গেরি

ধন্যবাদ @ জেডিম সমস্ত সময় এবং প্রচেষ্টার প্রশংসা করে।
গেরি

আমি ঠিক বুঝতে পেরেছি ... আপনি কি এটিকে বদলানো (এলোমেলোভাবে) আদৌ চান, বা কেবল সম্পূর্ণ তালিকা চান?
zdim

@zdim কেবল একটি সম্পূর্ণ তালিকা। :)
গেরি

উত্তর:


6

সব কিছুর কিছু সীমাবদ্ধতা আছে।

এখানে একটি খাঁটি পার্ল মডিউল রয়েছে যা এটি আপনার জন্য পুনরাবৃত্তভাবে করতে পারে। এটি একবারে পুরো তালিকা তৈরি করে না এবং আপনি অবিলম্বে ফলাফল পেতে শুরু করেন:

use v5.10;

use Set::CrossProduct;

my $set = Set::CrossProduct->new( [ ([ 'a'..'z' ]) x 5 ] );

while( my $item = $set->get ) {
    say join '', @$item
    }

মানুষ, আপনি এখন বুঝতে পারছেন না আমি কতটা খুশি। আপনাকে অনেক ধন্যবাদ!!
গেরি

3
অ্যালগরিদম :: লুপগুলিও NestedLoopsব্যবহার করা যেতে পারে: use Algorithm::Loops qw( NestedLoops ); NestedLoops([ ([ 'a'..'z' ]) x 5 ], sub { say join '', @_ } ); (ওপি কর্তৃক পূর্ববর্তী প্রশ্নের উত্তরে উল্লেখ করা হয়েছে যে তারা স্মৃতিশক্তি শেষ না হলে তারা এটি ব্যবহার করতে পারে ...)
আইকেগামি

8

globপ্রথম সব সম্ভব ফাইলের নাম প্রসারণও সৃষ্টি, তাই এটি প্রথম হবে সম্পূর্ণ তালিকা উৎপন্ন শেল-শৈলী উল্লিখিত glob / প্যাটার্ন এটা দেওয়া হয় না। কেবলমাত্র তখনই এটি পুনরুক্ত হবে, যদি স্কেলারের প্রসঙ্গে ব্যবহৃত হয়। এ কারণেই এটির ক্লান্তি ছাড়াই পুনরুক্তি করা এত কঠিন (অসম্ভব?); দেখতে এই পোস্টে

আপনার প্রথম উদাহরণে এটি 26 5 টি স্ট্রিং ( 11_881_376), প্রতিটি পাঁচটি অক্ষর দীর্ঘ। সুতরাং M 12 মিলিয়ন স্ট্রিংগুলির একটি তালিকা, (নিখুঁত) মোট 56Mb এর বেশি সাথে ... আরও একটি স্কেলারের জন্য ওভারহেড, যা আমি মনে করি কমপক্ষে 12 বাইট বা এ জাতীয়। সুতরাং একটি 100Mb এর অর্ডারে, খুব কমপক্ষে, ঠিক সেখানে একটি তালিকায়।

পার্লের (রেইজেক্স ব্যতীত) দৈর্ঘ্যের বিষয়ে আমি কোনও আনুষ্ঠানিক সীমা সম্পর্কে অবগত নই তবে globঅভ্যন্তরীণভাবে কী এমন সমস্ত কিছুই আছে এবং সেখানে অনাবন্ধিত সীমা থাকতে হবে - সম্ভবত কিছু বাফার কোথাও, অভ্যন্তরীণভাবে ছাপিয়ে গেছে? এটি কিছুটা বাড়তি।

এর চারপাশের উপায় হিসাবে - globপর্দার আড়ালে এর যাদু রোল না দিয়ে 5-চর স্ট্রিংগুলির তালিকাটি পুনরাবৃত্তভাবে উত্পন্ন করুন । তাহলে একেবারে কোনও সমস্যা হওয়া উচিত নয়।

যাইহোক, আমি আরামের জন্য পুরো জিনিসটিকে কিছুটা বড় মনে করি, এমনকি সেই ক্ষেত্রে। আমি সত্যিই একটি অ্যালগরিদম লেখার পরামর্শ দিচ্ছি যা একবারে একটি তালিকা উপাদান তৈরি করে এবং সরবরাহ করে (একটি "পুনরাবৃত্তিকারী"), এবং সেটির সাথে কাজ করে।

এমন অনেক ভাল গ্রন্থাগার রয়েছে যা (এবং আরও অনেক কিছু) করতে পারে, এর মধ্যে কয়েকটি হল অ্যালগরিদম :: এই বিষয়ে পূর্ববর্তী পোস্টে সুপারিশ করা লুপগুলি (এবং একটি মন্তব্যে), অ্যালগরিদম :: সংযুক্তি (একই মন্তব্য), Set::CrossProductঅন্য উত্তর থেকে এখানে ...

আরও মনে রাখবেন যে, এটি একটি চতুর ব্যবহারের সময় glob, লাইব্রেরিটি ফাইলগুলির সাথে কাজ করে। নীতিগতভাবে এটির অপব্যবহার ছাড়াও, আমি মনে করি যে এটি বৈধ প্রবেশের জন্য প্রত্যেকটির (12 মিলিয়ন ডলার) নাম পরীক্ষা করবে ! ( এই পৃষ্ঠাটি দেখুন )) এটি অনেক অপরিবর্তিত ডিস্কের কাজ। (এবং যদি আপনি "গ্লোবস" ব্যবহার করতে চান *বা ?কিছু সিস্টেমে এটি কেবল একটি স্ট্রিং রয়েছে যা আসলে ফাইল রয়েছে তার সাথে একটি তালিকা ফেরত দেয়, তাই আপনি চুপচাপ বিভিন্ন ফলাফল পেতে পারেন))


5  আমি 5-চার স্কেলারার আকারের জন্য 56 বাইট পাচ্ছি। যদিও এটি একটি ঘোষিত চলকের জন্য, যা কোনও বেনাম স্কেলারের চেয়ে কিছুটা বেশি সময় নিতে পারে, দৈর্ঘ্য -4 স্ট্রিং সহ পরীক্ষার প্রোগ্রামে প্রকৃত মোট আকারটি নিখরচায় গণিতের চেয়ে বড় আকারের বৃহত্তর ক্রম। সুতরাং আসল জিনিসটি 1 জিবির ক্রম হতে পারে, একটি ক্রিয়াকলাপে।

আপডেট   একটি সাধারণ পরীক্ষা প্রোগ্রাম যা 5-চর দীর্ঘ স্ট্রিংগুলির তালিকা তৈরি করে (একই globপদ্ধতির ব্যবহার করে ) সার্ভার-ক্লাস মেশিনে 15-ইশ মিনিট দৌড়ে এবং 725 এমবি মেমরি নিয়েছিল।

এটি এই সার্ভারে প্রকৃত 5-চর লম্বা স্ট্রিংয়ের আপাতদৃষ্টিতে সঠিক সংখ্যক উত্পাদন করেছে।


@ জেরি ফার্স্ট, আমি নিশ্চিত নই যে সমস্যাটি সীমাবদ্ধতার সাথে; এটি সন্ধান করছেন ... সম্ভবত তালিকাটি আগে তৈরি করুন, পুনরাবৃত্তভাবে (একবারে সব নয়), এবং এটি একটি সঠিক অ্যারেতে সঞ্চয় করুন? এটি অবশ্যই কোনও সীমা, 5-চর স্ট্রিংয়ের একটি "মুষ্টিমেয়" কাছাকাছি কোথাও পাবেন না। (এটি ডায়াগোনস্টিকও --- যদি এটি কাজ করে তবে তা প্রকৃতপক্ষে কিছুটা অভ্যন্তরীণ সীমা।)
zdim

@ গেরি মডিউলগুলির প্রয়োজন নেই --- কেবল তালিকাটি তৈরি করুন (পাঁচ-চর স্ট্রিংয়ের) প্রথমে একটি অ্যারেতে তৈরি করুন, টুকরো টুকরো করে একসাথে ব্যবহার করে একে একে টুকরো টুকরো করে রাখুন glob। (এর জন্য কিছু সাধারণ-মনের, অন্যান্য অ্যালগোরিদমের প্রয়োজন হবে Perhaps সম্ভবত আমি আপনার আগের প্রশ্নটিতে যা পোস্ট করেছি? এটি ভাল ডিবাগিং - আপনি যদি তালিকা ছাড়াই ইস্যুগুলি পেতে পারেন তবে আপনি জানেন যে সীমাটি এখানে চাপ দেওয়া হচ্ছে)) আমি কিছু আকারের অনুমান যুক্ত করেছি যে আমি পোস্টে
আসছি

@ জেরি time perl -MDevel::Size=total_size -wE'$chs = join ",", "a".."z"; @items = glob "{$chs}"x5; say STDERR "Total memory: ", total_size(\@items)/(1024**2), " Mb"... এবং আমাকে পরীক্ষা করতে দিন ... এখন এটি 30 সেকেন্ডের মধ্যে চলেছিল, কীভাবে এখানে ক্যাশেিং কাজ করে তা নিশ্চিত করে। আমি আর এস এস চলার সময় বাহ্যিক সরঞ্জামগুলির সাথেও পরীক্ষা করেছিলাম।
zdim

@ জেরি v5.29.2 তে একই আচরণ (এখন ~ 600 এমবি) ... এখনও এই সার্ভারে সেই ক্যাশে
চড়েছেন

@ গেরি v5.16 - 28 মিনিট (এটি চলাকালীন অবমূল্যায়নিত!) এবং 750Mb সহ, অন্য সার্ভার ক্লাস মেশিনের ফলাফল। এখন 5.29.2 এর নীচে পুনরায় পুনরায় ব্যয় করুন এবং আবার M 600 এমবি। সঠিক স্ট্রিং, এবং 26**5
সেগুলির
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.