java - 从大 xml 文件中提取大 xml block 的最佳方法

标签 java xml xpath xquery sax

我正在使用 XPath 从 XML 文件中提取大块。我的 xml 文件很大,它们来自 PubMed。我的文件类型的一个例子是:

ftp://ftp.ncbi.nlm.nih.gov/pubmed/baseline/medline17n0001.xml.gz

所以,通过使用

 Node result = (Node)xPath.evaluate("PubmedArticleSet/PubmedArticle[MedlineCitation/PMID = "+PMIDtoSearch+"]", doc, XPathConstants.NODE);

我通过 PMIDtoSearch 获得了这篇文章,非常完美。但这需要很多时间。我必须执行大约 800.000 次,因此使用此解决方案需要两个多月的时间。有些 block 有400多行,每个xml文件有超过400万行。

我也尝试过类似 getElementsByTagName 函数的解决方案,但它花费的时间几乎相同。

你知道如何改进解决方案吗?

谢谢。

最佳答案

我把你的文档加载到 exist-db 然后执行了你的查询,基本上是这样的:

xquery version "3.0";
let $medline := '/db/Medline/Data'
let $doc := 'medline17n0001.xml'
let $PMID := request:get-parameter("PMID", "")
let $article := doc(concat($medline,'/',$doc))/PubmedArticleSet/PubmedArticle[MedlineCitation/PMID=$PMID]
return
$article

文档在 400 毫秒内从远程服务器返回。如果我加强该服务器,我的期望会更低,并且它可以处理多个并发请求。或者,如果您将所有内容都放在本地,速度会更快。

自己试一试,我把数据留在了测试服务器中(记住这是在远程查询加利福尼亚州的亚马逊微型服务器):

http://54.241.15.166/get-article2.xq?PMID=8

http://54.241.15.166/get-article2.xq?PMID=6

http://54.241.15.166/get-article2.xq?PMID=1

当然,整个文档都在那里。您可以将该查询更改为 PMID=667 或 999 或其他任何内容,然后取回目标文档片段。

关于java - 从大 xml 文件中提取大 xml block 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45411275/

相关文章:

java - FixedWindowRollingPolicy 和 SizeBasedTriggeringPolicy 触发策略不适用于 logback 1.1.7

c++ - codesynthesis 不解析我的 xml 文件

xml - BizTalk 信封架构自关闭节点

java - JTextArea 行到 ArrayList<String>

java - 无法解析的日期 : "2011-12-08T02:01:02+01:00"

xml - R-XML 将节点拉入矩阵/DF 中以解决缺失节点的问题

ruby - 简单兄弟的 XPATH 是什么?

java - Chrome Java 中的 Selenium dhtmlxtree NoSuchElementException

java - 已签名的 Java 小程序突然出现混合代码警告

c# - 我如何从 xmlnodelist 中获取 xml 节点