用于Python的lxml库可以处理非常大的XML文件,大小可达(以及超过) 100 GB。但是它能处理非常大的(10亿字符或更多的) XML元素吗?
我的任务是通过base64编码将二进制文件转换为文本,然后将编码的文本插入到XML文件中的元素中。这会产生包含大量字符的字符串。
编码252‘m的base64使字符串3.45亿字符长(我在这里取四舍五入)。一个1.5GB的文件编码为一个略超过20亿个字符的字符串。
编码Python脚本可以将任意大小的字符串放入XML文件中。但是,如果元素长度超过14亿个字符,则解码脚本无法加载XML文件。
脚本失败的代码是:
huge_parser = ET.XMLParser(huge_tree=True)
inxml = ET.parse(xmlfile, huge_parser)如果文件元素大约有13亿个字符,那么它将正常运行。如果文件元素大约有16亿个字符,那么它将失败,并出现以下错误:
Traceback (most recent call last):
File "C:\Users\user1\Desktop\xml_parser.py", line 40, in <module>
inxml = ET.parse(xmlfile, huge_parser)
File "src\lxml\etree.pyx", line 3536, in lxml.etree.parse
File "src\lxml\parser.pxi", line 1875, in lxml.etree._parseDocument
File "src\lxml\parser.pxi", line 1901, in lxml.etree._parseDocumentFromURL
File "src\lxml\parser.pxi", line 1805, in lxml.etree._parseDocFromFile
File "src\lxml\parser.pxi", line 1177, in lxml.etree._BaseParser._parseDocFromFile
File "src\lxml\parser.pxi", line 615, in lxml.etree._ParserContext._handleParseResultDoc
File "src\lxml\parser.pxi", line 725, in lxml.etree._handleParseResult
File "src\lxml\parser.pxi", line 654, in lxml.etree._raiseParseError
File "bigfile.xml", line 14
lxml.etree.XMLSyntaxError: xmlSAX2Characters overflow prevented, line 14, column 1519383602我认为迭代器在这里不会有帮助,因为迭代器仍然会尝试加载整个庞大的元素。
我该试试潘达斯吗?它能处理这么大的数据吗?
发布于 2022-05-06 21:33:16
根据libxml2源,当libxml2将文本块合并为文本节点时会发生错误。有争议的代码 (第2539行,或仅搜索“防止溢出”)是:
if ((size_t)ctxt->nodelen > SIZE_T_MAX - (size_t)len ||
(size_t)ctxt->nodemem + (size_t)len > SIZE_T_MAX / 2) {
xmlSAX2ErrMemory(ctxt, "xmlSAX2Characters overflow prevented");
return;
}我相信SIZE_T_MAX等于0xffffff或4,294,967,295字节。由于Python在内部使用UCS2 (除非在宽模式下编译),所以它仅超过20亿个字符。
如果元素长度超过14亿字符,则解码脚本无法加载XML文件
上面的代码同时检查了字符串长度和节点总长度,因此,与其他开销相比,很有可能超出了限制。
https://stackoverflow.com/questions/72147229
复制相似问题