سؤال

لقد استخدمنا Drools كجزء من الحل ليكون بمثابة نوع من المرشح في تطبيق معالجة مكثف للغاية، وربما تشغيل ما يصل إلى 100 قاعدة على أكثر من 500000 كائن من الذاكرة العاملة.وتبين أنها بطيئة للغاية.هل لدى أي شخص آخر أي خبرة في استخدام Drools في تطبيق معالجة النوع الدفعي؟

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

المحلول

لم أعمل مع الإصدار الأحدث من Drools (آخر مرة استخدمته كان قبل عام تقريبًا)، ولكن في ذلك الوقت أثبتت معايير التحميل العالية لدينا أنه بطيء تمامًا.خيبة أمل كبيرة بعد أن اعتمدنا عليها في الكثير من هندستنا المعمارية.

على الأقل شيء جيد أتذكره عن Drolls هو أن فريق التطوير الخاص بهم كان متاحًا على IRC وكان مفيدًا للغاية، يمكنك تجربتهم، فهم الخبراء بعد كل شيء: irc.codehaus.org #يسيل لعابه

نصائح أخرى

يعتمد الأمر نوعًا ما على القواعد الخاصة بك - 500 ألف كائن معقول نظرًا لوجود ذاكرة كافية (يجب أن تملأ شبكة RETE في الذاكرة، لذا فإن استخدام الذاكرة هو مضاعف لـ 500 ألف كائن - أي مساحة للكائنات + مساحة لبنية الشبكة والفهارس وما إلى ذلك) - إنها من الممكن أنك تقوم بالترحيل إلى القرص والذي سيكون بطيئًا حقًا.

بالطبع، إذا كان لديك قواعد تتطابق مع مجموعات من نفس النوع من الحقائق، فقد يؤدي ذلك إلى انفجار في المجموعات التي يمكنك تجربتها، والتي حتى لو كان لديك قاعدة واحدة ستكون بطيئة حقًا.إذا كان لديك المزيد من المعلومات حول التحليل الذي تجريه، فمن المحتمل أن يساعد ذلك في إيجاد الحلول الممكنة.

لقد استخدمت Drools مع ذاكرة عاملة تحتوي على أكثر من مليون حقيقة.مع بعض الضبط لكل من القواعد الخاصة بك وJVM الأساسي، يمكن أن يكون الأداء جيدًا جدًا بعد بضع دقائق من بدء التشغيل الأولي.دعني اعلم اذا كنت تريد تفاصيل اكثر.

أنا فقط أتعلم اللعاب بنفسي، لذلك ربما أفتقد شيئًا ما، ولكن لماذا تتم إضافة الدفعة الكاملة المكونة من خمسمائة ألف كائن إلى الذاكرة العاملة مرة واحدة؟السبب الوحيد الذي يمكنني التفكير فيه هو أن هناك قواعد لا يتم تطبيقها إلا عندما يرتبط عنصران أو أكثر في الدفعة.

إذا لم يكن الأمر كذلك، فربما يمكنك استخدام جلسة عديمة الحالة والتأكيد على كائن واحد في كل مرة.أفترض أن القواعد ستعمل بشكل أسرع بمقدار 500 ألف مرة في هذه الحالة.

حتى لو كان الأمر كذلك، فهل تحتاج جميع قواعدك إلى الوصول إلى جميع الكائنات البالغ عددها 500 ألف؟هل يمكنك تسريع الأمور من خلال تطبيق القواعد لكل عنصر على حدة، ثم في المرحلة الثانية من المعالجة، قم بتطبيق قواعد مستوى الدُفعة باستخدام قاعدة قواعد وذاكرة عاملة مختلفة؟لن يؤدي هذا إلى تغيير حجم البيانات، لكن شبكة RETE ستكون أصغر لأنه سيتم إزالة القواعد البسيطة.

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

لم يتم تصميم Drools حقًا ليتم تشغيله على عدد كبير من الكائنات.لقد تم تحسينه لتشغيل قواعد معقدة على عدد قليل من الكائنات.

إن تهيئة الذاكرة العاملة لكل كائن إضافي بطيئة جدًا وتم تصميم إستراتيجيات التخزين المؤقت للعمل لكل كائن في الذاكرة العاملة.

واجهت مشاكل مع أخطاء OutOfMemory بعد تحليل بضعة آلاف من الكائنات.يؤدي تعيين مُحسِّن افتراضي مختلف إلى حل المشكلة.

OptimizerFactory.setDefaultOptimizer(OptimizerFactory.SAFE_REFLECTIVE);

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

هل تريد استخدام جلسة عديمة الحالة وإضافة الكائنات واحدًا تلو الآخر؟

يمكن أيضًا تعيين هذا المُحسّن باستخدام المعلمة -dmvel2.disable.jit = true

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