gpt4 book ai didi

r - 获取内存分配失败: growing nodeset hit limit with xml2 package

转载 作者:行者123 更新时间:2023-12-02 04:04:34 26 4
gpt4 key购买 nike

我正在使用 R 中的 xml2 包解析一些非常大的 xml 文件。read_xml() 成功加载了大文件,但是当我尝试使用 xml_find_all() 时,我收到“错误:内存分配失败:增长的节点集命中”限制。”我假设这个限制是在 libxml2 中设置的,也许是在 XPATH_MAX_NODESET_LENGTH var 中设置的?所以也许这不是 xml2 包本身的问题。但是 xml2 中有可能的解决方案吗?我尝试删除节点并释放内存,但没有成功。谢谢。

最佳答案

是的,您已经达到了 libxml2 XPath 引擎的硬编码节点集限制。来自xpath.c:

/*
* XPATH_MAX_NODESET_LENGTH:
* when evaluating an XPath expression nodesets are created and we
* arbitrary limit the maximum length of those node set. 10000000 is
* an insanely large value which should never be reached under normal
* circumstances, one would first need to construct an in memory tree
* with more than 10 millions nodes.
*/
#define XPATH_MAX_NODESET_LENGTH 10000000

一种选择是使用不同的值重新编译libxml2。或者您可以更改 XPath 表达式,以便它们永远不会遇到大于 10M 节点的节点集。请注意,此限制也适用于表达式求值期间创建的中间节点集。因此,不幸的是,使用谓词对节点集进行分段不会工作:

//element[position() < 5000000]
//element[position() >= 5000000 and position() < 10000000]
//element[position() >= 10000000 and position() < 15000000]

本质上,您必须确保每个 NodeTest不返回超过 10M 的节点。如果你做不到这一点,那你就很不幸了。

您还可以在 libxml2 mailing list 上提出此问题。我猜想引入此限制是为了防止可能导致拒绝服务攻击的恶意 XPath 表达式。但在我看来,表达式返回的节点永远不会多于输入文档中存在的节点。因此,节点集使用的最大内存量无论如何都受到输入文档大小的限制。

关于r - 获取内存分配失败: growing nodeset hit limit with xml2 package,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40159864/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com