কোনও ফাইলের প্রথম লাইন অপসারণ করতে sed
বনামের পারফরম্যান্সtail
টি এল; ডিআর
sed
খুব শক্তিশালী এবং বহুমুখী, তবে এটি এটিকে ধীর করে তোলে বিশেষত অনেকগুলি লাইনযুক্ত বড় ফাইলগুলির জন্য।
tail
কেবল একটি সাধারণ কাজ করে তবে এটি একটি ভাল এবং দ্রুত করে তোলে এমনকি অনেকগুলি লাইনযুক্ত বড় ফাইলগুলির জন্য।
ছোট এবং মাঝারি আকারের ফাইলগুলির জন্য sed
এবং tail
একই ধরণের দ্রুত সঞ্চালন করছে (বা ধীর আপনার প্রত্যাশার উপর নির্ভর করে)। তবে বৃহত্তর ইনপুট ফাইলগুলির জন্য (একাধিক এমবি), পারফরম্যান্সের পার্থক্যটি উল্লেখযোগ্যভাবে বৃদ্ধি পায় (শত শত এমবি'র সীমাতে থাকা ফাইলগুলির আকারের ক্রম), tail
পরিষ্কারভাবে ছাড়িয়ে যায় sed
।
পরীক্ষা
সাধারণ প্রস্তুতি:
বিশ্লেষণ করার জন্য আমাদের আদেশগুলি হল:
sed '1d' testfile > /dev/null
tail -n +2 testfile > /dev/null
নোট করুন যে আমি /dev/null
টার্মিনাল আউটপুট বা ফাইলটি সম্পাদনের জন্য প্রতিবার আউটপুটটি পাইপ করছি পারফরম্যান্সের বাধা হিসাবে writes
আসুন ডিস্ক I / O কে সম্ভাব্য বিঘ্ন হিসাবে অপসারণ করতে একটি র্যাম ডিস্ক সেট আপ করুন। আমি ব্যক্তিগতভাবে একটি tmpfs
মাউন্ট করা আছে /tmp
তাই আমি কেবল testfile
এই পরীক্ষার জন্য আমার সেখানে রেখেছি ।
তারপরে আমি একবার $numoflines
এই কমান্ডটি ব্যবহার করে এলোমেলো লাইন দৈর্ঘ্য এবং এলোমেলো তথ্য সহ নির্দিষ্ট পরিমাণ রেখাসমূহ সহ একটি র্যান্ডম টেস্ট ফাইল তৈরি করছি (নোট করুন এটি অবশ্যই সর্বোত্তম নয়, এটি>> 2 এম লাইনের জন্য সত্যই ধীর হয়ে যায়, তবে কে পাত্তা দেয় তা নয়) আমরা যা বিশ্লেষণ করছি):
cat /dev/urandom | base64 -w0 | tr 'n' '\n'| head -n "$numoflines" > testfile
ওহ, বিটিডব্লিউ আমার পরীক্ষার ল্যাপটপটি ইন্টেল i5-6200U সিপিইউতে উবুন্টু 16.04, 64 বিট চালাচ্ছে। শুধু তুলনার জন্য।
বড় ফাইলগুলির সময় নির্ধারণ:
একটি বিশাল সেট আপ করা testfile
:
উপরের কমান্ডটি চালানো numoflines=10000000
10 এম লাইন সমন্বিত একটি এলোমেলো ফাইল তৈরি করেছে, 600 এমবি থেকে কিছুটা দখল করে - এটি বেশ বিশাল, তবে আসুন এটি দিয়ে শুরু করা যাক আমরা পারি:
$ wc -l testfile
10000000 testfile
$ du -h testfile
611M testfile
$ head -n 3 testfile
qOWrzWppWJxx0e59o2uuvkrfjQbzos8Z0RWcCQPMGFPueRKqoy1mpgjHcSgtsRXLrZ8S4CU8w6O6pxkKa3JbJD7QNyiHb4o95TSKkdTBYs8uUOCRKPu6BbvG
NklpTCRzUgZK
O/lcQwmJXl1CGr5vQAbpM7TRNkx6XusYrO
আমাদের বিশাল সাথে সময়োচিত রান সম্পাদন করুন testfile
:
প্রথমে আমরা কী বিস্তৃতি নিয়ে কাজ করছি তা অনুমান করার জন্য প্রথমে উভয় কমান্ডের সাথে একটিমাত্র সময়সীমার চালানো যাক।
$ time sed '1d' testfile > /dev/null
real 0m2.104s
user 0m1.944s
sys 0m0.156s
$ time tail -n +2 testfile > /dev/null
real 0m0.181s
user 0m0.044s
sys 0m0.132s
আমরা বড় ফাইলগুলির জন্য ইতিমধ্যে একটি স্পষ্ট ফলাফল দেখতে পাচ্ছি, এর tail
চেয়ে তাত্পর্যপূর্ণ sed
। তবে কেবল মজাদার জন্য এবং এটির জন্য নিশ্চিত যে কোনও এলোমেলো পার্শ্ব প্রতিক্রিয়া বড় পার্থক্য করছে না, আসুন এটি 100 বার করুন:
$ time for i in {1..100}; do sed '1d' testfile > /dev/null; done
real 3m36.756s
user 3m19.756s
sys 0m15.792s
$ time for i in {1..100}; do tail -n +2 testfile > /dev/null; done
real 0m14.573s
user 0m1.876s
sys 0m12.420s
উপসংহারটি একই থাকে, sed
বড় ফাইলের প্রথম লাইন অপসারণ করতে অক্ষম, tail
সেখানে ব্যবহার করা উচিত।
এবং হ্যাঁ, আমি জানি বাশের লুপের নির্মাণগুলি ধীর গতিতে রয়েছে তবে আমরা এখানে তুলনামূলকভাবে কয়েকটি পুনরাবৃত্তি করছি এবং যে কোনও সময় প্লে লুপ সময় নেয় তা sed
/ tail
রানটাইমের তুলনায় তাত্পর্যপূর্ণ নয় ।
ছোট ফাইলগুলির সময় নির্ধারণ:
একটি ছোট সেট আপ testfile
:
সম্পূর্ণতার জন্য, আসুন আমরা আপনার কেবি রেঞ্জের একটি ছোট ইনপুট ফাইল রয়েছে এমন আরও সাধারণ ক্ষেত্রে লক্ষ্য করি। এর মতো দেখতে একটি এলোমেলো ইনপুট ফাইল তৈরি করা যাক numoflines=100
:
$ wc -l testfile
100 testfile
$ du -h testfile
8,0K testfile
$ head -n 3 testfile
tYMWxhi7GqV0DjWd
pemd0y3NgfBK4G4ho/
aItY/8crld2tZvsU5ly
আমাদের ছোট দিয়ে সময়োচিত রান করুন testfile
:
যেহেতু আমরা আশা করতে পারি যে এই জাতীয় ছোট ফাইলগুলির সময় অভিজ্ঞতা থেকে কয়েক মিলিসেকেন্ডের মধ্যে থাকে, আসুন এখনই 1000 টি পুনরাবৃত্তি করা যাক:
$ time for i in {1..1000}; do sed '1d' testfile > /dev/null; done
real 0m7.811s
user 0m0.412s
sys 0m7.020s
$ time for i in {1..1000}; do tail -n +2 testfile > /dev/null; done
real 0m7.485s
user 0m0.292s
sys 0m6.020s
আপনি দেখতে পাচ্ছেন, সময়গুলি বেশ একই রকম, ব্যাখ্যা করার বা অবাক করার মতো খুব বেশি কিছু নেই। ছোট ফাইলগুলির জন্য, উভয় সরঞ্জামই সমানভাবে উপযুক্ত।
sed
বিবেচনাটি হ'ল আরও পোর্টেবল: "+2"tail
উবুন্টুতে ভাল কাজ করার জন্য , যা জিএনইউ ব্যবহার করেtail
, তবে বিএসডি-তে কাজ করবে নাtail
।