লুপ বনাম সম্প্রসারণের পারফরম্যান্স


9

নীচের তুলনায় বিশেষজ্ঞের পরামর্শ প্রয়োজন:

লুপ ব্যবহার করে কোড বিভাগ:

for file in `cat large_file_list`
do
    gzip -d $file
done

সাধারণ সম্প্রসারণ ব্যবহার করে কোড বিভাগ:

gzip -d `cat large_file_list`

কোনটি দ্রুত হবে? বড় ডেটা সেট ম্যানিপুলেট করতে হবে।


1
সঠিক উত্তরটি gzipআপনার সিস্টেমে শুরু হতে কত সময় নেয় , ফাইল তালিকার ফাইলগুলির সংখ্যা এবং এই ফাইলগুলির আকারের উপর নির্ভর করবে ।
কুসালানন্দ

ফাইল তালিকায় প্রায় 1000 - 10000 ফাইল থাকবে। আকার কিছু কিলোবাইট থেকে 500 এমবি পর্যন্ত পরিবর্তিত হয়। আমার সিস্টেমে gzip শুরু করতে কতক্ষণ সময় লাগে আমার কোনও ধারণা নেই । কোনভাবে চেক?
লিওন

1
ঠিক আছে, তবে এটি ফাইলের নামগুলির দৈর্ঘ্যের উপরও নির্ভর করে । যদি ফাইলের নামগুলি দীর্ঘ হয় তবে কোনও সিস্টেম লুপ ছাড়াই এটি করার চেষ্টা করলে কিছু সিস্টেম একটি "আর্গুমেন্ট তালিকা খুব দীর্ঘ" ত্রুটি তৈরি করতে পারে কারণ কমান্ড প্রতিস্থাপনের ফলে শেলটি কার্যকর হওয়ার জন্য খুব দীর্ঘ কমান্ড লাইন তৈরি হবে would আপনি যদি তালিকার ফাইলগুলির সংখ্যার উপর নির্ভর করতে না চান তবে কেবল একটি লুপ ব্যবহার করুন। আপনি যে ফাইলগুলি সম্পাদন করবেন সেগুলির তুলনায় আপনি এই ফাইলগুলিকে সংক্ষেপণে উল্লেখযোগ্য পরিমাণ সময় ব্যয় করছেন?
কুসালানন্দ

লিওন আমার পরীক্ষার ফলাফলগুলি একবার দেখুন: "বিশাল-আরগলিস্ট" আমার সেটিংসে "লুপ" এর চেয়ে 20 গুণ দ্রুত।

প্রক্রিয়া শুরু এবং কমান্ড লাইনের দৈর্ঘ্যের মধ্যে একটি সুখী মাধ্যমের xargs gzip -d < large_file_listজন্য, ফাইলtr \\n \\0 large_file_list | xargs -0 gzip -d
নেমগুলিতে

উত্তর:


19

জটিলতা

নিম্নলিখিত কেবল কখনও কখনও কাজ করবে:

gzip -d `cat large_file_list`

তিনটি সমস্যা bashহ'ল ( এবং অন্যান্য বেশিরভাগ বোর্নের মতো শেল):

  1. এটির ব্যর্থ হবে যদি কোনও ফাইলের নামের স্পেস ট্যাব থাকে বা এতে নতুন লাইন অক্ষর থাকে (ধরে নিবেন $IFSযে সংশোধন করা হয়নি)। এটি শেলের শব্দ বিভাজনের কারণে

  2. যদি কোনও ফাইলের নামটিতে বিশ্ব-সক্রিয় অক্ষর থাকে তবে এটি ব্যর্থও দায়বদ্ধ। এটি কারণ ফাইলটি তালিকায় শেলটি পথের নাম প্রসারিত করবে ।

  3. ফাইলের নামগুলি শুরু -হলে (যদি POSIXLY_CORRECT=1এটি কেবলমাত্র প্রথম ফাইলের সাথে প্রযোজ্য) বা কোনও ফাইল নাম থাকলে তা ব্যর্থ হবে -

  4. এটিতে অনেকগুলি ফাইলের নাম থাকলে একটি কমান্ড লাইনে ফিট করার জন্য এটি ব্যর্থও হবে।

নীচের কোডটি উপরের কোডের মতো একই সমস্যার সাপেক্ষে (চতুর্থ ব্যতীত)

for file in `cat large_file_list`
do
    gzip -d $file
done

নির্ভরযোগ্য সমাধান

যদি large_file_listপ্রতি লাইনে আপনার ঠিক একটি ফাইলের নাম থাকে এবং নামক একটি ফাইল -তাদের মধ্যে না থাকে এবং আপনি একটি জিএনইউ সিস্টেমে থাকেন, তবে ব্যবহার করুন:

xargs -rd'\n' gzip -d -- <large_file_list

-d'\n'xargsইনপুট প্রতিটি লাইন একটি পৃথক ফাইল নাম হিসাবে আচরণ করতে বলে ।

-rxargsইনপুট ফাইলটি ফাঁকা থাকলে কমান্ডটি চালাবেন না বলে জানায় ।

--জানায় gzipযে নিম্নলিখিত যুক্তিগুলি শুরু করার পরেও বিকল্প হিসাবে বিবেচনা করা হবে না -। যদিও -এখনও -বলা হয় ফাইলের পরিবর্তে একা আচরণ করা হবে -

xargsপ্রতিটি কমান্ড লাইনে অনেকগুলি ফাইলের নাম রাখবে তবে এত বেশি নয় যে এটি কমান্ড লাইনের সীমা অতিক্রম করে। এটি একটি gzipপ্রক্রিয়া শুরু হওয়া আবশ্যক এবং হ্রাস করে এবং তাই এটি দ্রুত করে তোলে। এটিও নিরাপদ: ফাইলের নামগুলি শব্দ বিভাজন এবং পথের নাম প্রসার থেকেও সুরক্ষিত থাকবে ।


বিস্তারিত উত্তরের জন্য ধন্যবাদ। আমি আপনার উল্লিখিত 3 টি সমস্যা বুঝতে পারি। ফাইলের নামটি সহজ এবং সেই চ্যালেঞ্জগুলির মুখোমুখি হবে না কারণ তালিকাটি 20000 অবধি থাকবে And এবং আমার প্রশ্নটি মূলত এই দুটি বিভাগের পারফরম্যান্স নিয়ে। ধন্যবাদ।
লিওন

1
@ লিওন forলুপটি সবচেয়ে দূর থেকে est অন্য দুটি পদ্ধতি একে অপরের সাথে গতিবেগের খুব কাছাকাছি থাকবে।
1024

7
এছাড়াও, সম্ভাব্য সমস্যাগুলি বরখাস্ত করবেন না: স্ট্যাকএক্সচেঞ্জে এখানে অনেকগুলি প্রশ্ন হ'ল শব্দ বিভাজন বা পথের নাম প্রসারিত লোকদের ক্ষেত্রে ঘটেছিল যা এটি প্রত্যাশা করে না।
1024

5
এটিও নোট করুন যে ফাইলটি পড়ার ক্ষেত্রে তারতম্য রয়েছে xargs: কমপক্ষে জিএনইউ সংস্করণে --arg-fileবিকল্প রয়েছে (সংক্ষিপ্ত ফর্ম -a)। সুতরাং এক xargs -a large_file_list -rd'\n' gzip -d পরিবর্তে করতে পারে । কার্যকরীভাবে, কোন পার্থক্য যে থেকে, সরাইয়া <শেল অপারেটর এবং হবে xargsstdin থেকে পড়া (যা ফাইলে "লিঙ্ক" শেল), যখন -aহবে xargsস্পষ্টভাবে প্রশ্নে ফাইল খোলার
Sergiy Kolodyazhnyy

2
টেরডন এর parallelএকাধিক অনুলিপি চালানোর জন্য ব্যবহার সম্পর্কে অন্য মন্তব্যে উল্লেখ করেছে gzip, তবে xargs(কমপক্ষে জিএনইউ এক), এর -Pজন্যও স্যুইচ রয়েছে । মাল্টিকোর মেশিনে যা কোনও পার্থক্য করতে পারে। তবে এটিও সম্ভব যে ডিকম্প্রেশনটি পুরোপুরি I / O- আবদ্ধ।
ইলক্কাচু

12

আমি সন্দেহ করি যে এটি অনেক বেশি গুরুত্বপূর্ণ।

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

আমার লুপ দেখতে হবে

while IFS= read -r name; do
    gunzip "$name"
done <file.list

এটি অতিরিক্তভাবে কমান্ডের পরে ডেটা প্রক্রিয়াকরণের জন্য কমান্ড সন্নিবেশ করার অনুমতি দেয় gunzip। প্রকৃতপক্ষে, ডেটা আসলে কী এবং এটি দিয়ে কী করা দরকার তার উপর নির্ভর করে, ফাইলটি সংরক্ষণ না করে এটিকে প্রক্রিয়া করা এমনকি সম্ভব হতে পারে:

while IFS= read -r name; do
    zcat "$name" | process_data
done <file.list

( process_dataএমন কোনও পাইপলাইন যেখানে স্ট্যান্ডার্ড ইনপুট থেকে সঙ্কুচিত ডেটা পড়ে)

যদি ডেটা প্রসেসিং এর জটিলতা থেকে বেশি সময় নেয়, তবে লুপটি আরও দক্ষ কিনা তা প্রশ্ন অপ্রাসঙ্গিক হয়ে যায়।

আদর্শভাবে , আমি যদিও ফাইলনামগুলির একটি তালিকা কাজ না করা পছন্দ করি এবং এর পরিবর্তে ফাইলের নাম গ্লোব্বিং প্যাটার্ন ব্যবহার করি

for name in ./*.gz; do
    # processing of "$name" here
done

./*.gzপ্রাসঙ্গিক ফাইলগুলির সাথে মেলে এমন কিছু প্যাটার্ন কোথায় । এইভাবে আমরা ফাইলের সংখ্যার উপর নির্ভর করি না বা ফাইলের নামগুলিতে ব্যবহৃত অক্ষরগুলির উপর নির্ভর করি না (সেগুলিতে নিউলাইনস বা অন্যান্য শ্বেত স্পেস অক্ষর থাকতে পারে, বা ড্যাশ ইত্যাদির সাহায্যে শুরু করা যেতে পারে))

সম্পর্কিত:


5

এই দুটির মধ্যে, সমস্ত ফাইল সহ একটি ফাইলের একক অনুরোধে পাস gzipকরা দ্রুততর হওয়ার সম্ভবত সম্ভবত কারণ আপনাকে কেবল gzipএকবার লঞ্চ করতে হবে । (এটি হ'ল কমান্ডটি যদি কিছুতেই কাজ করে তবে সাবধানতার জন্য অন্যান্য উত্তরগুলি দেখুন))

তবে, আমি অপ্টিমাইজেশনের সুবর্ণ নিয়মের কথা মনে করিয়ে দিতে চাই : অকাল আগে এটি করবেন না।

  1. সমস্যাটি জানার আগে এই ধরণের জিনিসটি অনুকূলিত করবেন না।

    প্রোগ্রামটির এই অংশটি কি দীর্ঘ সময় নেয়? ভাল, বড় ফাইলগুলি ডিকম্প্রেসিং করতে পারে এবং আপনাকে এটি যেভাবেই করতে হবে, সুতরাং উত্তর দেওয়া এত সহজ হতে পারে না।

  2. পরিমাপ করা. সত্যই, এটি নিশ্চিত হওয়ার সেরা উপায়।

    আপনি ফলাফলগুলি নিজের চোখে (বা আপনার নিজের স্টপ ওয়াচের সাহায্যে) দেখতে পাবেন এবং তারা আপনার পরিস্থিতিতে প্রয়োগ করবে যা ইন্টারনেটে এলোমেলো উত্তর নাও পেতে পারে। উভয় রূপ স্ক্রিপ্টগুলিতে রাখুন এবং চালান time script1.sh, এবং time script2.sh। (ওভারহেডের নিখুঁত পরিমাণ পরিমাপ করতে খালি সংক্ষেপিত ফাইলগুলির একটি তালিকা দিয়ে এটি করুন))


0

আপনার ডিস্কটি কত দ্রুত?

এটিতে আপনার সমস্ত সিপিইউ ব্যবহার করা উচিত:

parallel -X gzip -d :::: large_file_list

সুতরাং আপনার সীমা সম্ভবত আপনার ডিস্কের গতি হতে চলেছে।

আপনি এর সাথে সামঞ্জস্য করার চেষ্টা করতে পারেন -j:

parallel -j50% -X gzip -d :::: large_file_list

এটি পূর্ববর্তী কমান্ডের সমান্তরালভাবে অর্ধেক কাজ চালাবে এবং আপনার ডিস্ককে কম চাপ দেবে, সুতরাং আপনার ডিস্কের উপর নির্ভর করে এটি আরও দ্রুত হতে পারে।

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