为什么 XML 编辑/XPath 搜索会占用如此多的内存?

为什么 XML 编辑/XPath 搜索会占用如此多的内存?

我有一个很大的 XML 文件(大约 37 MB — 它是大约 350 页的 Word 文档中的底层 XML 文件),我正尝试使用 XPath 进行搜索。我通过“手动”而不是编程的方式执行此操作,方法是在 XML 编辑器中打开文件并在那里进行搜索。

我尝试过 Xmplify、QXmlEdit、带有 XPath 扩展的 SublimeText 等,它们都存在同样的问题:打开文件的速度非常慢,占用大量内存,而且几乎不可能进行 XPath 搜索。

举个例子,我刚刚尝试在 Xmplify 中打开该文件。这花了大约三分钟,在没有打开其他文档的情况下,Xmplify 的内存使用量上升到大约 1 GB。

然后我尝试执行这个 XPath 查询(我正在寻找由字符串组成的所有跟踪插入英文):

//w:ins[w:r/w:t = 'en']

这给了我超氧化物歧化酶一段时间。在 CPU 达到 100% 左右运行了大约 15 分钟后,Xmplify 现在使用60 GB 内存,我的操作系统告诉我应用程序内存已经不足,需要强制退出。

在我看来,对于单个文件中的单个 XPath 查询来说,这似乎有些过分,即使它是一个相当大的文件。我尝试使用的其他应用程序并没有那么糟糕,但打开文档并运行任何类型的 XPath 查询仍然需要几分钟,而且它们的内存使用量也是以 GB 为单位的,所以这不仅仅是 Xmplify 效率低下的问题。

这是什么原因?为什么 XPath (显然) 如此耗费资源?它在不同的操作系统之间有什么不同吗 (我的是 macOS Sierra)?

 

我犹豫是否要在这里或 StackOverflow 上发布这篇文章,但由于我特别不是通过编程实现,我决定这可能是更好的选择。如果有更好的 Stack,请随意迁移。

答案1

一个主要因素是你的 XPath 以//so开头每个 XML 元素将检查整个文档中您给出的谓词 - 这与您写的一样/descendant-or-self::*。如果您可以缩小可能相关的元素的范围,例如通过提供绝对 XPath,则/w:document/w:body/w:p/w:r/w:t/w:ins[w:r/w:t = 'en']t很可能会大大加快您的搜索速度。即使您无法命名所有层次结构级别但需要w:*某个地方,它很可能仍然要快得多。

仅供参考,带有 XML 插件的 notepad++ 也提供有限的 XPath 支持,因此您可以尝试一下。

仅供参考,如果您有权访问 inubit 安装(因为它是企业服务总线/业务流程引擎,因此仅由公司等组织授权,而不是个人),恕我直言,值得一试。您应该更改 Workbench 设置编辑器选项>最大文件大小为 40MB,这样您的文件就会被很好地呈现,然后将您的 XML 文件加载到 XML 编辑器中并触发基于 XPath 的搜索。

仅供参考,根据我的经验,Saxon 相当快,因此创建一个用于搜索的 XSLT 可能是值得的。您可以调用它,例如 via,java.exe -jar saxon-he-10.5.jar -xsl:searchScript.xsl -s:input.xml -o:output.xml 并在其中searchScript.xsl提供一个简单的 XSLT,它将复制任何找到的元素并将output.xmlXPath 添加到搜索结果中(如果太大,只需删除location="{fn:path()}"),例如

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:fn="http://www.w3.org/2005/xpath-functions" exclude-result-prefixes="#all" version="3.0">  
  <xsl:output method="xml" encoding="UTF-8"/>  
  <xsl:template match="/">
    <results>
      <xsl:for-each select="//w:ins[w:r/w:t = 'en']">
        <result location="{fn:path()}">
          <xsl:copy-of select=". "/>
        </result>
      </xsl:for-each>
    </results> 
  </xsl:template> 
</xsl:stylesheet>

相关内容