يظهر التقدم بايثون محلل XML عند تحميل ملف ضخم

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

  •  05-07-2019
  •  | 
  •  

سؤال

Im باستخدام بايثون بنيت في محلل XML تحميل 1.5 جيجا ملف XML ويأخذ كل يوم.

from xml.dom import minidom
xmldoc = minidom.parse('events.xml')

أريد أن أعرف كيفية الحصول على داخل وقياس التقدم المحرز حتى أنا يمكن أن تظهر شريط التقدم.أي أفكار ؟

مينيدوم لديه طريقة أخرى تسمى parseString() أن يعود شجرة DOM افتراض السلسلة يمكنك تمرير صالح XML, إذا أردت تقسيم الملف نفسي إلى قطع وتمريرها إلى parseString في وقت واحد ، يمكن دمج جميع دوم الأشجار معا مرة أخرى في نهاية المطاف ؟

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

المحلول

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

وأوصي أيضا يحاول محلل المغتربين في وقت ما من المفيد جدا http://docs.python.org/library/pyexpat.html

وعن التقدم باستخدام ساكس:

وكما يقرأ ساكس ملف تدريجيا يمكنك التفاف الكائن الملف الذي تمر مع بنفسك وتتبع مدى تم قراءة.

وتحرير: أود أيضا أن تفعل فكرة لا تشبه من أنفسكم ملف تقسيم والانضمام DOM في نهاية، وبهذه الطريقة أنت الكتابة أفضل لديك محلل XML الخاصة، أوصي بدلا من استخدام محلل ساكس وأتساءل أيضا ما غرضك من القراءة ملف 1.5 أزعج في شجرة DOM؟ تبدو وكأنها ساكس سيكون من الأفضل هنا

نصائح أخرى

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

http://docs.python.org/library/xml.sax.html

ولدي شيء مشابه جدا لجتك، وليس باي كيوت، وذلك باستخدام واجهة برمجة التطبيقات pulldom. يحصل يطلق عليه قليلا في وقت واحد باستخدام جتك الأحداث الخمول (حتى GUI لا حبس)، ومولدات بيثون (لحفظ الدولة تحليل).

def idle_handler (fn):
  fh = open (fn)  # file handle
  doc = xml.dom.pulldom.parse (fh)
  fsize = os.stat (fn)[stat.ST_SIZE]
  position = 0

  for event, node in doc:
    if position != fh.tell ():
      position = fh.tell ()
      # update status: position * 100 / fsize

    if event == ....

    yield True   # idle handler stays until False is returned

 yield False

def main:
  add_idle_handler (idle_handler, filename)

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

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