首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python不能处理超过1GB文本的XML元素。

Python不能处理超过1GB文本的XML元素。
EN

Stack Overflow用户
提问于 2022-05-06 20:51:44
回答 1查看 51关注 0票数 -1

用于Python的lxml库可以处理非常大的XML文件,大小可达(以及超过) 100 GB。但是它能处理非常大的(10亿字符或更多的) XML元素吗?

我的任务是通过base64编码将二进制文件转换为文本,然后将编码的文本插入到XML文件中的元素中。这会产生包含大量字符的字符串。

编码252‘m的base64使字符串3.45亿字符长(我在这里取四舍五入)。一个1.5GB的文件编码为一个略超过20亿个字符的字符串。

编码Python脚本可以将任意大小的字符串放入XML文件中。但是,如果元素长度超过14亿个字符,则解码脚本无法加载XML文件。

脚本失败的代码是:

代码语言:javascript
复制
huge_parser = ET.XMLParser(huge_tree=True)
inxml = ET.parse(xmlfile, huge_parser)

如果文件元素大约有13亿个字符,那么它将正常运行。如果文件元素大约有16亿个字符,那么它将失败,并出现以下错误:

代码语言:javascript
复制
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

我认为迭代器在这里不会有帮助,因为迭代器仍然会尝试加载整个庞大的元素。

我该试试潘达斯吗?它能处理这么大的数据吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-06 21:33:16

根据libxml2源,当libxml2将文本块合并为文本节点时会发生错误。有争议的代码 (第2539行,或仅搜索“防止溢出”)是:

代码语言:javascript
复制
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文件

上面的代码同时检查了字符串长度和节点总长度,因此,与其他开销相比,很有可能超出了限制。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72147229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档