OverflowError: 解析大XML时,大小无法适应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无法解析它。所以我解压缩了它。提前感谢任何帮助。
1 个回答
0
错误信息已经说明了问题。某个地方使用了32位整数来存储文件的大小或者在文件中的位置。
首先,请确认你正在使用64位的Python。如果你用的是32位的Python,处理一个12 GiB的大数据文件时,很可能会出现问题,尤其是当你想把内容保存在内存中时。
其次,你可以尝试使用其他的解析器。最简单的选择是 xml.etree.cElementTree
(当然你也可以试试非C版本,但那样会慢很多)。如果这个解析器也出问题,那就试试 lxml
,并让你的代码使用 iterparse
。cElementTree
是Python自带的,而 lxml
需要单独安装。
你可以通过查看这个问题和答案来获取一些灵感: 使用 lxml 和 iterparse() 解析一个大约1GB的XML文件