OverflowError: 解析大XML时,大小无法适应int

2 投票
1 回答
3098 浏览
提问于 2025-04-18 13:35

我有一个非常大的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无法解析它。所以我解压缩了它。提前感谢任何帮助。

1 个回答

0

错误信息已经说明了问题。某个地方使用了32位整数来存储文件的大小或者在文件中的位置。

首先,请确认你正在使用64位的Python。如果你用的是32位的Python,处理一个12 GiB的大数据文件时,很可能会出现问题,尤其是当你想把内容保存在内存中时。

其次,你可以尝试使用其他的解析器。最简单的选择是 xml.etree.cElementTree(当然你也可以试试非C版本,但那样会慢很多)。如果这个解析器也出问题,那就试试 lxml,并让你的代码使用 iterparsecElementTree 是Python自带的,而 lxml 需要单独安装。

你可以通过查看这个问题和答案来获取一些灵感: 使用 lxml 和 iterparse() 解析一个大约1GB的XML文件

撰写回答