ما هي الطريقة الأكثر فعالية من استخراج المعلومات من عدد كبير من ملفات xml في الثعبان ؟

StackOverflow https://stackoverflow.com/questions/344559

سؤال

لدي الدليل الكامل (~103, 104) من ملفات XML التي لا تحتاج إلى استخراج محتويات العديد من المجالات.لقد اختبرت مختلف موزعي xml, و منذ أن كنت لا تحتاج إلى التحقق من صحة محتويات (غالية) كنت أفكر ببساطة باستخدام xml.موزعي.المغتربين (أسرع واحد) أن تذهب من خلال الملفات واحدا تلو الآخر لاستخراج البيانات.

  1. هل هناك أكثر كفاءة الطريقة ؟ (نص بسيط مطابقة لا يعمل)
  2. هل أنا بحاجة إلى إصدار جديد ParserCreate() لكل ملف جديد (أو السلسلة) أو يمكن إعادة استخدام نفس واحدة لكل ملف ؟
  3. أي محاذير?

وذلك بفضل!

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

المحلول

أسرع طريقة ستكون مباراة السلاسل (مثلا التعبيرات العادية) بدلا من تحليل XML - اعتمادا على XMLs هذا يمكن أن تعمل في الواقع.

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

تحرير:

  • هي الملفات على محرك أقراص محلي أو محرك أقراص الشبكة?شبكة I/O سوف أقتلك هنا.
  • المشكلة parallelizes مسلي - يمكنك تقسيم العمل بين العديد من أجهزة الكمبيوتر (أو عدة عمليات على الكمبيوتر متعددة النواة).

نصائح أخرى

عادة, أود أن أقترح استخدام ElementTree هو iterparse, أو لمزيد من السرعة ، نظيرتها من lxml.أيضا محاولة استخدام تجهيز (يأتي مدمج مع 2.6) إلى يوازي.

الشيء المهم حول iterparse هو أن تحصل على عنصر (الفرعية)الهياكل كما هي تحليل.

import xml.etree.cElementTree as ET
xml_it = ET.iterparse("some.xml")
event, elem = xml_it.next()

event سوف دائما تكون السلسلة "end" في هذه الحالة, ولكن يمكنك أيضا تهيئة محلل أن أقول لك أيضا عن عناصر جديدة كما هي تحليل.لم يكن لديك أي ضمان أن جميع الأطفال قد تم تحليلها في هذه النقطة, ولكن سمات هناك, إذا كنت مهتما فقط في ذلك.

نقطة أخرى هي أنه يمكنك التوقف عن القراءة عناصر من التكرار في وقت مبكر ، أيقبل كل وثيقة تم تجهيزها.

إذا كانت الملفات كبيرة (من هم؟) ، هناك لغة مشتركة للحفاظ على الذاكرة الاستخدام المستمر كما هو الحال في تدفق محلل.

إذا كنت تعرف أن ملفات XML يتم إنشاؤها باستخدام أي وقت مضى نفس الخوارزمية, قد يكون أكثر فعالية على عدم القيام بأي تحليل XML على الإطلاق.E. g.إذا كنت تعرف أن البيانات في خطوط 3 ، 4 ، 5 ، كنت قد قرأت من خلال الملف سطرا سطرا ، ومن ثم استخدام التعبيرات العادية.

بالطبع هذا النهج من شأنه أن تفشل إذا كانت الملفات غير المولدة آليا ، أو تنشأ من مولدات مختلفة ، أو إذا كان مولد التغييرات على مر الزمن.ومع ذلك أنا متفائل أنه أن تكون أكثر كفاءة.

أم لا يمكنك تدوير محلل الكائنات غير ذي صلة إلى حد كبير.العديد من الكائنات سوف تحصل على خلق حتى واحد محلل كائن لا نعول كثيرا.

شيء واحد لم تشر ما إذا كان أو لا كنت تقرأ XML إلى دوم من نوع ما.أظن أنك ربما لا, ولكن على فرصة قبالة كنت لا.استخدام xml.ساكس بدلا من ذلك.باستخدام ساكس بدلا من دوم سوف تحصل على دفعة كبيرة في الأداء.

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