Java XML:处理大数据

Java XML:处理大数据,java,xml,xslt,blackberry,large-files,Java,Xml,Xslt,Blackberry,Large Files,出于以下目的,您建议使用哪种XML解析器: XML文件(已格式化,包含空格)约为800MB。它主要包含三种类型的标记(我们称它们为n、w和r)。 它们有一个名为id的属性,我必须尽快搜索它 删除我不需要的属性可以节省30%左右,也许更多 第一部分用于优化第二部分:是否有好的工具(命令行linux和windows,如果可能)可以轻松删除某些标记中未使用的属性?我知道可以使用XSLT。或者有什么简单的选择吗?另外,我可以将它分成三个文件,每个标签一个文件,以提高后期解析的速度。。。 速度对于数据的准

出于以下目的,您建议使用哪种XML解析器:

XML文件(已格式化,包含空格)约为800MB。它主要包含三种类型的标记(我们称它们为n、w和r)。 它们有一个名为id的属性,我必须尽快搜索它

删除我不需要的属性可以节省30%左右,也许更多

第一部分用于优化第二部分:是否有好的工具(命令行linux和windows,如果可能)可以轻松删除某些标记中未使用的属性?我知道可以使用XSLT。或者有什么简单的选择吗?另外,我可以将它分成三个文件,每个标签一个文件,以提高后期解析的速度。。。 速度对于数据的准备来说并不太重要,当然,如果它只需要几分钟而不是几个小时,那就更好了

第二部分:一旦我准备好数据,无论是否缩短,我应该能够搜索我提到的ID属性,这是时间关键

使用
wc-l
进行的估计告诉我,大约有300万个N标签和418K个W标签。后者最多可包含约20个子标签。W标签也包含一些,但它们会被剥离

“我所要做的就是在包含特定id属性的标记之间导航。一些标记引用了其他id,因此给了我一棵树,甚至一个图形。原始数据很大(如前所述),但结果集不应该太大,因为我只需要选择某些元素

现在的问题是:对于这种处理,我应该使用什么样的XML解析库?我将首先使用Java6,并考虑将其移植到BlackBerry

只创建一个平面文件索引id并指向文件中的偏移量是否有用?甚至有必要进行上半部分提到的优化吗?或者有没有已知的解析器处理原始数据的速度相当快

小提示:为了测试,我使用文件最后一行的id,并使用grep搜索id。这花了大约一分钟的核心2二重唱

如果文件变得更大,比如说5 GB,会发生什么

我感谢您的任何通知或建议。
非常感谢大家,我正在使用XMLStarlet()处理巨大的XML文件。linux和windows都有版本。

大型XML文件和Java堆空间是一个棘手的问题。StAX可以处理大文件——它当然可以处理1GB的文件,而不会让人眼花缭乱。这里有一篇关于使用StAx的有用文章:这篇文章让我在大约20分钟内启动并运行了它

出于以下目的,您建议使用哪种XML解析器:XML文件(已格式化,包含空格)大约为800MB

也许您应该看看VTD-XML:(请参阅下载)

它主要包含三种类型的标记(我们称它们为n、w和r)。它们有一个名为id的属性,我必须尽快搜索它

我知道这是亵渎神明,但你有没有考虑过对awk或grep进行预处理?我的意思是,我知道你实际上不能解析xml,也不能用它来检测嵌套结构(比如xml)中的错误,但也许你的xml是这样一种形式,它恰好是可能的

我知道可以使用XSLT。或者有什么简单的选择吗


据我所知,XSLT处理器在源文档的DOM树上运行……因此它们需要解析整个文档并将其加载到内存中……对于如此大的文档(或者您有足够的内存来处理它)可能不是一个好主意有一种称为流式XSLT的技术,但我认为这种技术非常年轻,没有很多实现,没有免费的AFAIK,因此您可以尝试。

正如Bouman所指出的,将其视为纯文本处理将为您提供尽可能快的速度


要将其作为XML处理,唯一实用的方法是使用SAX解析器。Java API内置SAX解析器完全能够处理此问题,因此无需安装任何第三方库。

即使对于大型文件,xslt的速度也相对较快。对于大文件,技巧不是首先创建DOM。使用URL源或流源传递到转换器

要去除空节点和不需要的属性,请从Identity Transform模板开始,并将其过滤掉。然后使用XPATH搜索所需的标记

您还可以尝试多种变体:

  • 将较大的XML文件拆分为较小的文件,并使用XML Include保留其组成。这非常类似于将大型源文件拆分为较小的源文件,并使用include“x.h”之类的概念。这样,您可能不必处理大文件

  • 通过标识转换运行XML时,使用生成的-id()函数为每个感兴趣的节点分配UNID

  • 构建用于搜索的前端数据库表。使用上面生成的UNID快速确定数据在文件中的位置

    • “我可以将其拆分为三个文件”


      尝试XmlSplit。这是一个命令行程序,带有指定在何处按元素、属性等分割的选项。速度也非常快。

      XSLT除了在浏览器中使用DOM外,对DOM没有任何作用。它只会创建一个新文档。@Rob你能澄清你的评论吗?如果XSLT不在DOM树上运行,它究竟是如何工作的?来自XSLT规范的ThanksRob:“用XSLT表示的转换描述了将源树转换为结果树的规则。”现在,我意识到实现可以自由地以任何他们喜欢的方式来做这件事,但顺便说一句,他们是通过首先将源解析为树来完成的。解析树是否符合完整的DOM并不重要,因为文件大小不同