2012-12-10 36 views
1

在我正在处理的应用程序中,我必须处理非常大的XML文件(文件大小高达2GB)......我想运行一些XQuery命令这些文件使用Saxon Java库。java-如何使用Saxon库处理大型XML文件

我该如何做到这一点,即一次只将文件中的一小部分记录保存在内存中,并且文件在这些小数据集中处理(而不是一次处理整个文件) - 同时,XQuery命令的输出应该是正确的?我宁愿使用只有0.5GB RAM的机器来运行XQuery命令 - >因此它不可能一次将整个XML加载到内存中。

回答

1

达到此功能的最佳方式(但很复杂)是限制可能的XQuery命令(即枚举所有可能的用例)。之后,每个文件处理一次,使用SAX或StAX方式为整个XML文件创建一个内部“索引”,该索引将搜索关键字映射到XML文件中的偏移量(开始和结束)。这些偏移量应该指向XML文件的一小部分,但格式良好的部分,可以单独加载并进行分析,以检查它是否与指定的XQuery匹配。另一种方法是将XML文件解析成一些基于磁盘的临时数据库(如Apache Derby),并创建您自己的XQuery => SQL翻译器或解释器来访问此文件数据。另一种方法是将SAX或StAX XML文件解析为一些基于磁盘的临时数据库(如Apache Derby)。你不会得到OutOfMemoryException,但这种方法的性能......可能不是最好用于一次使用的文件。

+0

@visergey好的我想我想了解更多关于第一种方式 - 即创建索引,然后加载小部分的XML文件独立...有没有任何指南/如何(甚至Java库或代码示例)这表明如何做到这一点?谢谢.... – Arvind

2

Saxon对流式处理的支持在XSLT中比在XQuery中更强大,这很大程度上是因为XSLT工作组在设计XSLT 3.0时一直在解决这个问题。您可以在

http://www.saxonica.com/documentation9.4-demo/index.html#!sourcedocs/streaming

注意找到该产品的流媒体功能,这些信息只提供在商业版,撒克逊-EE。

对于简单的 “突发模式” 流,你可以做这样的事情:在萨克森$ë

:流(DOC( 'big.xml')/ * /记录[@字段= '234'])返回$ e /名称

“突发模式”本质上是指对源文档的大量小型不相交子树进行操作的查询。