거대한 파일을로드 할 때 Python의 XML 파서의 진행 상황 표시

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

  •  05-07-2019
  •  | 
  •  

문제

IM은 Python의 내장 XML 파서를 사용하여 1.5 gig XML 파일을로드하기 위해 하루 종일 걸립니다.

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

나는 그 안에 들어가는 방법을 알고 진행 상황을 보여줄 수 있도록 진행 상황을 측정해야합니다. 어떤 아이디어?

Minidom은 Parsestring ()이라는 또 다른 메소드가 있습니다. Parsestring ()이 통과하는 문자열을 가정하면 Dom 트리를 반환합니다. 유효한 XML이라고 생각합니다. 파일을 한 번에 한 번에 하나씩 파일을 전달하면 모든 것을 병합 할 수 있습니다. 끝에 돔 나무가 다시 함께 있습니까?

도움이 되었습니까?

해결책

Usecase는 DOM 대신 SAX 파서를 사용하고 DOM은 메모리에 모든 것을로드하고 SAX는 대신 라인 별 구문 분석을 수행하고 필요한 경우 이벤트에 대한 핸들러를 작성하여 진행할 수 있으므로 진행 상황 표시기도 작성할 수 있습니다.

나는 또한 언젠가 국외 파서를 시도하는 것이 좋습니다. 그것은 매우 유용합니다.http://docs.python.org/library/pyexpat.html

색소폰을 사용한 진전 :

Sax는 파일을 점차적으로 읽으면 자신이 전달한 파일 객체를 직접 랩핑하고 읽은 양을 추적 할 수 있습니다.

편집 : 나는 또한 파일을 스스로 나누고 Dom에 가입한다는 생각도 마음에 들지 않습니다. 그렇게하면 자신의 XML 파서를 쓰는 것이 좋습니다. 대신 Sax Parser를 사용하는 것이 좋습니다. ? Sax가 여기에서 더 나을 것 같습니다

다른 팁

XML을 구문 분석하는 다른 수단을 사용하는 것을 고려 했습니까? 이러한 큰 XML 파일의 트리를 구축하는 것은 항상 느리고 메모리 집약적입니다. 메모리에 전체 트리가 필요하지 않으면 스트림 기반 구문 분석이 많이 더 빠르게. 트리 기반 XML 조작에 익숙해지면 약간 어려울 수 있지만, 큰 속도 증가 (시간 대신 분)의 형태로 지불합니다.

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

Pyqt가 아닌 Pygtk와는 Pygdom API를 사용하여 매우 비슷한 것이 있습니다. GTK 유휴 이벤트 (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