كيفية زيادة سرعة سير عمل bash باستخدام جنو بالتوازي

GNU parallelهي أداة سطر أوامر لتشغيل المهام بالتوازي.

parallelرائع وينتمي إلى صندوق أدوات كل مبرمج. لكني وجدت المستندات مربكة بعض الشيء في البداية. لحسن الحظ ، يمكنك البدء في أن تكون مفيدًا باستخدام parallelبعض الأوامر الأساسية.

لماذا هو parallelمفيد جدا؟

دعنا نقارن التنفيذ المتسلسل والمتوازي لنفس مهمة الحوسبة المكثفة.

تخيل أن لديك مجلدًا به ملفات صوتية بتنسيق .wav لتحويلها إلى ملف .flac:

هذه ملفات كبيرة جدًا ، كل منها لا يقل عن غيغابايت.

سنستخدم أداة سطر أوامر رائعة أخرى ، ffmpeg ، لتحويل الملفات. إليك ما نحتاج إلى تشغيله لكل ملف.

ffmpeg -i audio1.wav audio1.flac

لنكتب نصًا لتحويل كل واحد بالتسلسل:

# convert.sh ffmpeg -i audio1.wav audio1.flac ffmpeg -i audio2.wav audio2.flac ffmpeg -i audio3.wav audio3.flac ffmpeg -i audio4.wav audio4.flac ffmpeg -i audio5.wav audio5.flac

يمكننا توقيت تنفيذ مهمة ما عن طريق الإعداد المسبق timeعند استدعاء البرنامج النصي من المحطة. timeسوف تطبع الوقت الحقيقي المنقضي أثناء التنفيذ.

time ./convert.sh

سينتهي نصنا في ما يزيد قليلاً عن دقيقة.

ليس سيئا. لكن الآن دعونا نجريها بالتوازي!

لا يتعين علينا تغيير أي شيء بخصوص البرنامج النصي الخاص بنا. باستخدام -aالعلم ، يمكننا توجيه النص الخاص بنا مباشرةً إلى parallel. parallelسيتم تشغيل كل سطر كأمر منفصل.

parallel -a ./convert.sh

باستخدام parallel، تم إجراء تحويلنا في أكثر من نصف الوقت بقليل. لطيف!

مع خمسة ملفات فقط ، هذا الاختلاف ليس مشكلة كبيرة. ولكن مع وجود قوائم أكبر ومهام أطول ، يمكننا توفير الكثير من الوقت parallel.

لقد واجهت parallelأثناء العمل مع مهمة معالجة البيانات التي من المحتمل أن تستمر لمدة ساعة أو أكثر إذا تم تنفيذها بالتتابع. مع parallel، استغرق الأمر بضع دقائق فقط.

parallelتعتمد الطاقة أيضًا على جهاز الكمبيوتر الخاص بك. يحتوي جهاز Intel i7 الخاص بجهاز MacBook Pro على 4 مراكز فقط. حتى هذه المهمة الصغيرة دفعتهم جميعًا إلى أقصى حدودهم:

قد تحتوي أجهزة الكمبيوتر الأكثر قوة على معالجات ذات 8 أو 16 أو حتى 32 مركزًا ، مما يوفر وقتًا هائلاً من خلال موازاة المهام الخاصة بك.

أن تكون مفيدًا مع parallel

الميزة الكبرى الأخرى parallelهي قصرها وبساطتها. لنبدأ بنص بايثون مقرف ونحوله إلى مكالمة نظيفة parallel.

إليك برنامج نصي بلغة Python لإنجاز تحويل الملفات الصوتية:

import subprocess path = Path.home()/'my-data-here' for audio_file in list(path.glob('*.wav')): cmd = ['ffmpeg', '-i', str(audio_file), f'{audio_file.name.split(".")[0]}.flac'] subprocess.run(cmd, stdout=subprocess.PIPE)

ييكيس! هذا في الواقع الكثير من التعليمات البرمجية التي يجب التفكير فيها فقط لتحويل بعض الملفات. (يستغرق هذا حوالي 1.2 دقيقة للتشغيل).

دعنا نحول بايثون إلى parallel.

استدعاء البرنامج النصي مع parallel -a

parallel -a your-script-here.sh هو سطر واحد لطيف استخدمناه أعلاه للتوجيه في نص bash الخاص بنا.

هذا أمر رائع ولكنه يتطلب منك كتابة البرنامج النصي bash الذي تريد تنفيذه. في مثالنا، ما زلنا كتب من كل مكالمة الفردية ffmpegفي convert.sh.

مواسير وسلاسل الاستيفاء مع parallel

لحسن الحظ ، parallelيمنحنا طريقة للحذف convert.shبالكامل.

إليكم كل ما علينا أن نجريه لتحقيق تحويلنا:

ls *.wav | parallel ffmpeg -i {} {.}.flac

دعونا نكسر هذا.

نحصل على قائمة بجميع ملفات .wav في الدليل الخاص بنا مع ls *.wav. ثم نقوم بتوصيل ( |) هذه القائمة إلى parallel.

يوفر Parallel بعض الطرق المفيدة للقيام باستيفاء السلسلة ، لذلك يتم إدخال مسارات الملفات بشكل صحيح.

الأول هو {}الذي parallelيستبدل تلقائيًا بسطر واحد من مدخلاتنا.

العامل الثاني هو {.}الذي سيُدخل سطرًا واحدًا ولكن مع إزالة أي امتدادات للملف.

إذا قمنا بتوسيع الأمر الذي يديره parallelلسطر الإدخال الأول ، فسنرى ...

ffmpeg -i audio1.wav audio1.flac

Args مع Parallel

كما اتضح ، لا نحتاج حتى إلى الانتقال من lsلإكمال مهمتنا. يمكننا أن نذهب بشكل أبسط:

parallel ffmpeg -i {} {.}.flac ::: *.wav

تم تمرير الحجج parallelلتحدث بعد الأمر ويتم الفصل بينها بـ :::. في هذه الحالة ، الوسيطة لدينا هي *.wav، والتي ستوفر قائمة بجميع ملفات .wav في دليلنا. تصبح هذه الملفات المدخلات لعملنا الفائق السرعة parallel.

حقيقة ممتعة: parallelتم بناؤه بواسطة Ole Tange وتم نشره في عام 2011. وفقًا له ، يمكنك استخدام الأداة للبحث دون الاستشهاد بالورقة المصدر مقابل رسوم متواضعة تبلغ 10000 يورو!

شكرا للقراءة!