OverflowError:在使用DOM解析大型XML时,size不适合int

时间:2014-07-16 20:21:33

标签: python xml dom minidom

我有一个非常大的XML文件,我需要获取包含特定参数的所有节点(不同的公司信息)。 XML解压缩大约12 GB。

    <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不会解析它。所以我把它枪杀了。 提前感谢您的帮助。

1 个答案:

答案 0 :(得分: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