2014-07-16 30 views
2

我有一個相當大的XML文件,我需要獲取包含特定參數的所有節點(不同的公司信息)。 XML是約12 GB解壓縮。OverflowError:使用DOM解析大型XML時size不適合int 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

隨着文件大小增加2GB以上,我們將看到越來越多的情況下,軟件無法應付,因爲它使用32位位偏移。我們的大多數編程環境都受限於語言級別,使用32位int作爲數組,字符串等的偏移。沒有簡單的答案。 –

+0

@MichaelKay:我同意。不過,最近我有了一些相當令人驚喜的驚喜。許多舊工具不支持超過32位的索引,但同樣有很多工具已被更新。大多數情況下,您可以通過識別問題並找到更新的工具來進行管理。 – DrV

回答

0

錯誤消息告訴它。某處使用32位int來存儲文件的大小或文件中的位置。

首先,請檢查您是否正在運行64位Python。如果您打算將內容保存在RAM中,那麼如果您使用12 GiB數據文件提供它,32位Python很可能會窒息。

其次,您可能想嘗試另一個解析器。最簡單的嘗試是xml.etree.cElementTree(當然你可以嘗試非C版本,但是這會太慢)。如果它嗆,然後嘗試lxml並使您的代碼使用iterparsecElementTree是標準配置的一部分,lxml必須單獨安裝。

你可能會通過看這個問題的一些想法和問題的答案:using lxml and iterparse() to parse a big (+- 1Gb) XML file

+0

我檢查了python,沒問題,工作在64位和looooong整數:) 感謝您的建議。 elementTree也無法處理我的文件,他花了10分鐘吞下所有49 GB的RAM,並且這個過程被殺死了。 lxml沒有安裝在服務器上,我不想問這個問題。 xml.sax雖然做到了,但我可以逐行解析我的文件並提取所需的信息。 elementTree.iterparser可以完成這項工作,sax只是有一個更好的手冊和例子。 – antonavy