`Wc -l` কীভাবে কাজ করে?


11

আমাকে একটি বড় ফাইল পড়তে হবে এবং আমি এটি পড়তে শুরু করার আগে, আমার ফাইলটির মোট লাইন সংখ্যা (যা কয়েক মিলিয়নতে রয়েছে) জানতে হবে।

আমি প্রচুর সমাধান প্রয়োগ করেছি এবং এর একটি সন্ধান করেছি। তবে আমার অনুসন্ধানের সময় আমি কীভাবে wc -lকাজ করে তা দেখার জন্য ভাবছিলাম । আমি গুগলে কিছুই খুঁজে পাইনি।

যদিও আমি আমার সমস্যার সমাধান খুঁজে পেয়েছি, তবুও আমি জানতে চাই যে wc -lএটি কীভাবে কাজ করে যেহেতু এটি কয়েক সেকেন্ডে 92 মিলিয়ন লাইনের সাহায্যে কোনও ফাইলের লাইন সংখ্যা গণনা করতে পারে!

কিভাবে?


উত্তর:


20

এটি পুরো ফাইলটি পড়ে এবং লাইন-এন্ডিংয়ের সংখ্যা গণনা করে। লাইন শেষ গণনা সত্যিই সস্তা; ব্যয় করা বেশিরভাগ সময় ফাইল পড়া। যদি ফাইলটি (বেশিরভাগ) বাফার ক্যাশে থাকে তবে সেটিও সস্তা হবে। অন্যথায়, এটি আপনার ফাইল স্টোরেজের গতির উপর নির্ভর করবে।

অন্য কথায়, কোন জাদু নেই।


এটি পুরো ফাইলটি পড়ে এবং লাইন শেষের সংখ্যা গণনা করে? শেষ রেখায় পৌঁছানোর জন্য, এটি মূলত পুরো লাইনটি শেষ অবধি না পড়া পর্যন্ত পড়ে না? এবং এর অর্থ এটি পুরো ফাইলটি পড়বে, তাই না?
ডিজিট্রাভেলার

@ ডেট্রাভেলার: হ্যাঁ, এটি পুরো ফাইলটি পড়বে, যেমনটি আমি বলেছিলাম। এটি একসাথে একসাথে বা সমস্ত একবারে পড়ে না, তবে এটি প্রতিটি চরিত্রটি পড়ে এবং গণনা করে যে এই অক্ষরগুলির মধ্যে কতগুলি লাইন-এন্ড অক্ষর।
ধনী

7

ডব্লিউসি কেবলমাত্র কাঁচা বাইটের ব্লকগুলিতে ফাইলটি পড়েন (অন্তর্নিহিত ফাইল সিস্টেমের প্রাকৃতিক ব্লক-আকারের বহুগুণে ভাল যা ফাইলটি অবস্থিত)।
তারপরে এটি কেবলমাত্র লাইনের শেষের অক্ষরগুলি গণনা করে বাফারের মাধ্যমে স্ক্যান করে। (আপনি -l আউটপুট ব্যতিরেকে অন্য তথ্য চাইলে কেবল স্থান, ট্যাব, ফর্ম-ফিড এবং অন্যান্য বিশেষ অক্ষরও এটি গণনা করে))

ডিস্ক থেকে পড়া গতির ক্ষেত্রে ব্যয়বহুল অংশ। এর তুলনায় বাফারটিকে স্ক্যান করতে অবহেলা-সক্ষম সময় লাগে।

বলুন আপনি প্রতি লাইনে গড়ে 100 টি অক্ষর সহ 90 মিলিয়ন লাইন পেয়েছেন।
এটি প্রায় 9.000.000.000 অক্ষর বা প্রায় 860 এমবি।
Sata-3Gb / s ড্রাইভ সহ একটি শালীন পিসি 10 সেকেন্ডের মধ্যে এটি করবে। এমনকি একই সময়ে কিছু অন্যান্য ক্রিয়াকলাপের তুলনামূলকভাবে ধীরে ধীরে ফাইল সিস্টেমেও।
কিছু পারফরম্যান্স টিউনিং এবং একটি অপ্টিমাইজড ফাইল সিস্টেম সহ একটি দ্রুত মেশিন এটি SATA-6G এবং একটি এসএসডি ড্রাইভ অবলম্বন না করে 5 সেকেন্ডের মধ্যেও করতে পারে।


এটি কেবলমাত্র \nলাইফের শেষের ( ) অক্ষরগুলি গণনা করে বাফারের মাধ্যমে স্ক্যান করে - "-l, --lines নতুন লাইনের গণনাগুলি print n \" মুদ্রণ করে - থেকে প্রাপ্তwc.c
রাহুল পাতিল

@ রাহুলপাতিল সর্বাধিক বাস্তবায়ন কেবলমাত্র নিউলাইনগুলি গণনা করার চেয়ে আরও অনেক কিছু করে। উপরের শীর্ষ মন্তব্যে উল্লিখিত উদাহরণটি দেখুন। লিনাক্স কোর ইউটিলিটিগুলিতে যেমন ডব্লিউসি ব্যবহৃত হয়।
টনি

হ্যাঁ .. আমি এটি দেখেছি .. কেবল উল্লেখ করেছি কারণ, প্রশ্ন সম্পর্কে wc -l.. দুঃখিত ...
রাহুল পাতিল

3

বিনামূল্যে সফ্টওয়্যার বিশ্বে স্বাগতম। আপনি সর্বদা উত্স কোডটি দেখতে পারেন

যদিও আমি অবশ্যই স্বীকার করতে পারি যে আমি কোনও সি প্রোগ্রামার নই, সুতরাং আমি এমন নই যা আপনার পক্ষে কোডটি সত্যই ব্যাখ্যা করতে পারে (এবং আমি নিজেই আগ্রহী হব)।

আমি জানি যেহেতু ডাব্লুসিটি ফাইল নিজেই খোলেন না, তবে ওএসকে এটি করতে বলে, এটি মূলত ওএসের উপর নির্ভর করে এবং অবশ্যই ফাইলটি কীভাবে সংরক্ষণ করা হয় তা নির্ভর করে। এগুলি ছাড়াও, আমি আশা করছিলাম যে সঠিক প্রোগ্রামিং অনুশীলনগুলি অবশ্যই স্থানের মধ্যে থাকতে হবে, যেমন ফাইল একবারে পুরোপুরি পড়ার চেষ্টা না করা, ইত্যাদি etc.


'একবারে পুরো ফাইলটি পড়ার চেষ্টা না করে' বলতে কী বোঝায়?
ডিজিট্রাওলার

মানে একটি ফাইলকে মেমোরিতে লোড করা, বলুন, একটি একক স্ট্রিং / অ্যারেতে। পার্ল সম্প্রদায়ের একে স্লারপিং বলা হয়, এবং এটি একটি দ্রুত এবং নোংরা সমাধান যা ঠিক আছে যখন আপনি জানেন যে আপনি কয়েকটি লাইন পড়বেন, তবে সত্যিই বিশাল ফাইলটি একবারে মেমরির মধ্যে খাওয়ানো খুব কমই ধারণা idea
আলয়েস মাহডাল

1
অন্যদিকে, আপনি পড়তে, বলতে পারেন, say৪ কিবি, নতুন লাইন গণনা করুন এবং এটিকে ফেলে দিতে পারেন, পুনরাবৃত্তি করতে পারেন ... এই পদ্ধতিতে আপনি ফাইলটি যত বড়ই হোক না কেন, সর্বাধিক Ki৪ কিবি-র বেশি কিছু খেয়ে ফেলবেন। (আপনি যখন বুঝতে পারবেন যে নিউলাইনে 2 বাইট থাকতে পারে এবং এটি 2 টি অংশের মধ্যে বিভক্ত হয়ে যায়; এখনই মজা শুরু হয়)
অ্যালোস মাহডাল

খুব গুরুত্বপূর্ণ নয়, তবে: "যেহেতু ডাব্লুসিটি ফাইল নিজেই খোলেন না, তবে ওএসকে এটি করতে বলে" - আপনি এটির অর্থ কী তা নিশ্চিত হন না তবে আমি সন্দেহ করি এটি সঠিক কিনা। এটি অবশ্যই সমস্ত চরিত্র নিজেই পড়ছে।
আরজান

2
@ আরজান যদিও সত্যই সঠিক: এম্বেড থাকা সিস্টেমগুলি বাদ দিয়ে প্রোগ্রামগুলি খুব সহজেই সত্যই পড়তে পারে, কার্নেল এবং ওএসের পুরো বিষয়টি এটি তাদের জন্য কাজ করে। আসলে, ওপেন (), ক্লোজ (), রিড () (এটি লিনাক্স, উইন্ডোজ, সকেট বা ফাইল হোক) সমস্ত সিস্টেম কল যা প্রকৃত প্রোগ্রামগুলির অভ্যন্তরীণ কার্যকারিতার কোনও ধারণা নেই।
আলয়েস মাহডাল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.