2014-07-16 2 views
2

XML 파일이 상당히 크기 때문에 특정 매개 변수가 포함 된 모든 노드 (다른 회사 정보)를 가져와야합니다. XML의 압축을 풀면 약 12GB입니다.OverflowError : DOM을 사용하여 큰 XML을 구문 분석하는 동안 크기가 int에 맞지 않습니다.

<Companies xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ...> 

<Company id="782634892" source="abcd"> 
    <attribution>abcde</attribution> 
    <name xml:lang="en">company name</name> 
    <Phones> 
    <Phone type="phone" hide="0"> 
     <formatted>+1800111</formatted> 
     <country>1</country> 
     <prefix>800</prefix> 
     <number>111</number> 
    </Phone> 
    </Phones> 
    <Rubrics> 
    <rubric ref="184107947"/> 
    </Rubrics> 

더 많은 내용이 있지만 중요하지 않습니다.

내 코드는 매우 간단하다 :

그것은 내가 테스트를 위해 만든 작은 파일에서 작동
file = open('companies2.xml') 
data = file.read() 
dom = parseString(data) 
key = dom.getElementsByTagName("Company") 
for elements in key: 
    rubricsArray = elements.getElementsByTagName("Rubrics")[0].getElementsByTagName("rubric") 
    for rub in rubricsArray: 
     if rub.attributes["ref"].value == '32432793389': 
      print elements.toxml() 

. 그러나 여기에서는 그렇지 않습니다.

Traceback (most recent call last): 
    File "./XMLparse.py", line 29, in <module> 
    dom = parseString(data) 
    File "/usr/lib/python2.7/xml/dom/minidom.py", line 1930, in parseString 
    return expatbuilder.parseString(string) 
    File "/usr/lib/python2.7/xml/dom/expatbuilder.py", line 940, in parseString 
    return builder.parseString(string) 
    File "/usr/lib/python2.7/xml/dom/expatbuilder.py", line 223, in parseString 
    parser.Parse(string, True) 
OverflowError: size does not fit in an int 

아이디어를 얻는 방법은 무엇입니까? gz 파일을 사용하려고했지만 zmore는 임의의 첫 번째 줄을 만듭니다.

------> companies2.xml.gz <------ 

DOM은 구문 분석하지 않습니다. 그래서 총에 맞았 어. 도움을 미리 요청 해 주셔서 감사합니다.

+0

파일 크기가 2 기가 바이트 이상으로 성장함에 따라, 우리는 그것을 사용하기 때문에 소프트웨어가 대처할 수없는 경우 더 많은 경우를 보게 될 것입니다 32 비트 오프셋. 우리의 프로그래밍 환경의 대부분은 언어 수준에서 32 비트 int를 배열, 문자열 등으로의 오프셋으로 사용하도록 제한됩니다. 쉬운 대답이 아닙니다. –

+0

@MichaelKay : 동의합니다. 그러나 최근에는 아주 즐거운 놀라움을했습니다. 많은 오래된 도구는 32 비트 색인 생성을 지원하지 않지만 똑같이 많은 도구가 업데이트되었습니다. 대개의 경우 문제를 확인한 다음 업데이트 된 도구를 찾아서 관리 할 수 ​​있습니다. – DrV

답변

0

오류 메시지가 알려줍니다. 어딘가에서 파일의 크기 나 파일의 위치를 ​​저장하기 위해 32 비트 정수를 사용합니다.

먼저 64 비트 Python을 실행하고 있는지 확인하십시오. 32 비트 Python은 내용을 RAM에 유지하려는 경우 12 GiB 데이터 파일로 피드하면 매우 위험합니다.

둘째, 다른 파서를 사용해 볼 수 있습니다. 가장 쉬운 시도는 xml.etree.cElementTree입니다 (물론 비 C 버전을 사용해 볼 수도 있지만 너무 느릴 것입니다). 질식하는 경우 lxml을 시도하고 iterparse 코드를 사용하십시오. cElementTree은 표준 배포본의 일부이며, lxml을 별도로 설치해야합니다.

당신은이 질문을보고하여 몇 가지 아이디어와 답변을 얻을 수 있습니다 using lxml and iterparse() to parse a big (+- 1Gb) XML file

+0

파이썬을 확인한 결과, 64 비트와 정수로 작업하는 것이 좋습니다. 조언을 주셔서 감사합니다. elementTree가 내 파일을 처리하지 못했지만 49GB의 RAM을 모두 삼킨 데 10 분이 걸렸습니다. 프로세스가 종료되었습니다. lxml은 서버에 설치되지 않았으므로 요청하지 않았습니다. xml.sax가 트릭을 만들었지 만 필자는 파일을 한 줄씩 파싱하고 필요한 정보를 추출 할 수있었습니다. elementTree.iterparser가 그 일을 할 수 있었고, 색소폰은 더 좋은 매뉴얼과 예제를 가지고있었습니다. – antonavy

관련 문제