Python의 많은 XML 파일에서 정보를 추출하는 가장 효율적인 방법은 무엇입니까?

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

문제

디렉토리 전체가 있습니다 (~ 103, 104여러 필드의 내용을 추출 해야하는 XML 파일의). 다른 XML 파서를 테스트했는데 내용 (비싼)을 검증 할 필요가 없기 때문에 xml.parsers.expat (가장 빠른 것)를 사용하여 파일을 통해 하나씩 진행하여 데이터.

  1. 더 효율적인 방법이 있습니까? (간단한 텍스트 매칭이 작동하지 않습니다)
  2. 각 새 파일 (또는 문자열)에 대해 새 ParserCreate ()를 발행해야합니까 (또는 문자열) 모든 파일에 대해 동일한 파일을 재사용 할 수 있습니까?
  3. 경고가 있습니까?

감사!

도움이 되었습니까?

해결책

가장 빠른 방법은 XML에 따라 XML을 구문 분석하는 대신 문자열 (예 : 일반 표현식)을 일치시키는 것입니다. 실제로 작동 할 수 있습니다.

그러나 가장 중요한 것은 이것입니다. 여러 옵션을 통해 생각하는 대신, 그냥 구현하고 작은 세트에서 시간을 보내십시오. 이것은 거의 같은 시간이 걸리며 실수를 줄 것입니다.

편집하다:

  • 파일은 로컬 드라이브 또는 네트워크 드라이브에 있습니까? 네트워크 I/O는 여기서 당신을 죽일 것입니다.
  • 이 문제는 사소하게 비슷하게 비슷합니다. 여러 컴퓨터 (또는 멀티 코어 컴퓨터의 여러 프로세스)로 작업을 분할 할 수 있습니다.

다른 팁

일반적으로 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" 이 경우, 파서를 초기화하여 새로운 요소가 구문 분석 할 때도 알려줄 수도 있습니다. 당신은 그 시점에서 모든 어린이 요소가 구문 분석되었을 것이라는 보장이 없지만, 당신이 그것에 관심이 있다면 속성이 있습니다.

또 다른 요점은 전체 문서가 처리되기 전에 Ierator에서 요소 읽기를 조기에 중지 할 수 있다는 것입니다.

파일이 크면 (그것들입니까?) 스트리밍 파서와 마찬가지로 메모리 사용을 일정하게 유지하는 일반적인 관용구가 있습니다.

XML 파일이 ever-same 알고리즘을 사용하여 생성된다는 것을 알고 있다면 XML 구문 분석을 전혀 수행하지 않는 것이 더 효율적일 수 있습니다. 예 : 데이터가 3 행, 4 및 5 행에 있다는 것을 알고 있다면 라인 별 파일을 읽은 다음 정규식을 사용할 수 있습니다.

물론, 파일이 기관에서 생성되지 않았거나 다른 생성기에서 발생하거나 시간이 지남에 따라 생성기가 변경되면 해당 접근법이 실패합니다. 그러나 나는 그것이 낙관적입니다 ~일 것이다 더 효율적입니다.

파서 객체를 재활용하는지 여부는 크게 관련이 없습니다. 더 많은 객체가 생성 될 것이므로 단일 파서 객체는 실제로 크게 계산하지 않습니다.

당신이 나타내지 않은 한 가지는 XML을 어떤 종류의 돔으로 읽고 있는지 여부입니다. 나는 당신이 아마 그렇지 않을 것이라고 생각하지만, 당신이 기회에 당신은 그렇지 않습니다. 대신 xml.sax를 사용하십시오. DOM 대신 색소폰을 사용하면 상당한 성능 향상이 가능합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top