سؤال

أرغب في تسريع فهرسة بيانات 10 جيجابايت في فهرس لوسين. هل سيكون TPL طريقة جيدة للقيام بذلك؟ هل سأحتاج إلى تقسيم البيانات إلى أجزاء ثم يبدأ كل مؤشر ترابط في فهرسة قطع الفهرسة؟

للحفاظ على مستجيب واجهة المستخدم ، هل سيكون عمال الخلفية أفضل طريقة أو مهمة أو أي شيء آخر؟

هل سولر يفعل شيئًا كهذا بالفعل؟ أم أنه لا يزال من المفيد أن رمز هذا بنفسي.

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

المحلول

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

Parallel.ForEach(docs, d => { writer.Add(d,analyzer) });

بحيث يتعامل .NET مع تقسيم البيانات.

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

Solr متعدد الخيوط بطبيعته ، لذلك ستفعل نفس المقتطف الذي أعطيته من قبل ، باستثناء بدلاً من الاتصال بالكاتب مباشرة ، ستتصل بـ REST/Solrnet.

كقاعدة عامة ، إذا سألت "هل يجب أن أستخدم Solr أو جعلها بنفسي؟" الجواب هو دائما تقريبا "استخدم solr". لا أستطيع التفكير في أي سبب تريد أن تجعله نفسك هنا ، إلا إذا كان JVM سيئًا حقًا أو تكره Java حقًا.

نصائح أخرى

على افتراض أنك تستخدم Java - كان لدي تجارب جيدة في الفهرسة باستخدام مؤشرات ترابط متعددة. فهرسة Lucene هي في الأساس CPU في تجربتي ، وهذا يعني إذا كنت تفرخ مؤشرات الترابط N يمكنك استخدام جميع النوى n.

لوكين IndexWriter يتعامل مع التزامن حتى لا داعي للقلق بشأن ذلك. يمكن أن تتصل المواضيع الخاصة بك فقط indexWriter.addDocument كلما كانوا على استعداد للقيام بذلك.

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

كان المشروع الثاني أكثر تعقيدًا. كان النظام "يزحف" مجموعة من المستندات ، أي لم يكن واضحًا منذ البداية عدد المستندات الموجودة. لذلك كان من الضروري الحفاظ على "قائمة انتظار" من الوثائق التي تم اكتشافها بالفعل. وفي عملية تحليل تلك المستندات وفهرستها ، كان من الممكن اكتشاف المزيد من المستندات التي تمت إضافتها أيضًا إلى قائمة الانتظار. تم ملء قائمة الانتظار في البداية مع المستند الأولي / البذور. لقد قمت بإنشاء فصل autostopthreadpool لإدارة المواضيع ، نرحب بك تحميل إذا أردت. (تجمعات خيوط JVM تحتاج إلى "إضافة" جميع المهام ثم "انتظر الانتهاء" ، والتي لم تكن مناسبة لأن معالجة المهمة يمكن أن تؤدي إلى اكتشاف مهام جديدة)

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