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



我有一个相当大的XML文件,我需要获得包含特定参数的所有节点(不同的公司信息)。解压后的XML大约有12gb。

    <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不会解析它。所以我把它拉上了拉链。谢谢你的帮助。

错误消息告诉它。某个地方使用32位int来存储文件的大小或文件中的位置。

首先,请检查您运行的是64位Python。如果您打算将内容保存在RAM中,则为32位Python提供12gib数据文件很可能会阻塞。

第二,您可能需要尝试另一个解析器。最容易尝试的是xml.etree.cElementTree(当然你可以尝试非c版本,但那太慢了)。如果它阻塞,那么尝试lxml并使您的代码使用iterparsecElementTree是标准发行版的一部分,lxml必须单独安装。

通过查看这个问题和答案,您可能会得到一些想法:使用lxml和iterparse()解析一个大的(+- 1Gb) XML文件

相关内容

  • 没有找到相关文章

最新更新