سؤال

لدي مليون صف في جدول قاعدة البيانات.لكل صف لا بد لي من تشغيل ملف exe مخصص، وتحليل الإخراج وتحديث جدول قاعدة بيانات آخر

كيف يمكنني تشغيل عملية صفوف متعددة بالتوازي؟

لدي الآن مهمة بسيطة لبيانات البيانات-> getData-> تشغيل البرنامج النصي (عملية تشغيل ، إخراج تحليل)-> تخزين البيانات لـ 6000 صف استغرق الأمر 3 ساعات.

هل كانت مفيدة؟

المحلول

يوجد عنق الزجاجة الوحيد هنا، وهو تشغيل العملية لكل صف.لن تساعد زيادة "EngineThreads" على الإطلاق، حيث سيكون هناك مؤشر ترابط واحد فقط يقوم بتشغيل هذا البرنامج النصي المعين على أي حال.ربما لا يهم الوقت الذي يقضيه في التحويلات الأخرى على الإطلاق.العمليات هي أشياء ثقيلة الوزن، وتشغيل الآلاف منها لن يكون رخيصًا أبدًا.

يمكنني التفكير في الأفكار التالية لجعلها أفضل:

1) أفضل طريقة لإصلاحها هي تحويل ملف EXE المخصص الخاص بك إلى تجميع واستدعائه من تحويل البرنامج النصي - لتجنب الحمل الزائد لإنشاء العمليات، وتحليل المخرجات، وما إلى ذلك.

2) إذا كان عليك استخدام العمليات المنفصلة، ​​فيمكنك محاولة تشغيل هذه العمليات بالتوازي.سيكون من المفيد أن تنتظر العملية في الغالب بعض المدخلات/المخرجات (أي.إنه I/O منضم).إذا كانت العمليات مرتبطة بالذاكرة أو وحدة المعالجة المركزية، فلن تربح الكثير من خلال تشغيلها بالتوازي.

2 أ) نص معقد وحزمة بسيطة.

لتشغيلها بالتوازي، قم بتعديل طريقة ProcessInput في البرنامج النصي الخاص بك لبدء العملية بشكل غير متزامن، ولا تنتظر اكتمال العملية - انتقل إلى الصف التالي وقم بإنشاء العملية التالية.اشترك في مخرجات العملية وقم بمعالجة الحدث الذي تم الخروج منه، حتى تعرف متى تنتهي.حدد عدد العمليات التي يتم تشغيلها بالتوازي - وإلا فسوف تنفد الذاكرة.انتظر حتى تتم جميع العمليات قبل العودة من استدعاء ProcessInput.

2ب) نص بسيط وحزمة معقدة.

احتفظ بالنص التسلسلي الحالي، ولكن قم بتقسيم البيانات باستخدام SSIS.قم بإضافة تحويل تقسيم مشروط، وتقسيم تدفق الإدخال إلى تدفقات متعددة، بناءً على بعض تعبيرات التجزئة - وهو الأمر الذي سيجعل كل مخرج يتلقى نفس كمية البيانات تقريبًا.عدد التدفقات يساوي عدد مثيلات العملية التي تريد تشغيلها بالتوازي.أضف تحويل البرنامج النصي الخاص بك إلى كل مخرجات الانقسام الشرطي.الآن يجب عليك أيضًا زيادة خاصية "Engine Threads" :) وسيتم تشغيل هذه التحويلات بالتوازي.(ملحوظة:بناءً على العلامة، أفترض أنك تستخدم SSIS 2008.ستحتاج إلى إدراج تحويلات Union All إضافية حتى تعمل في SSIS 2005).

وهذا من شأنه أن يؤدي إلى تحسين أدائها، لكن الملايين من العمليات تعتبر كثيرة.من الصعب أن تحصل على أداء جيد حقًا هنا.

نصائح أخرى

إذا كنت تنفيذ هذه العملية باستخدام "تدفق البيانات" حاوية، ثم هناك خاصية عليه اسم "EngineThreads" الذي التخلف إلى قيمة 5. يمكنك تعيينها إلى عدد أكبر مثل 20، والتي ستكرس المزيد من المواضيع لمعالجة تلك الصفوف.

وهذا هو مجرد قرص الأداء أو optmisation، إذا حزمة مباحث أمن الدولة الخاصة بك لا يزال قيد التشغيل ببطء حقا ثم أود أن ربما تعالج الهندسة المعمارية وتصميم الحزمة الخاصة بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top