XML:处理大数据

时间:2010-02-20 10:57:45

标签: java xml xslt blackberry large-files

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

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

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

优化第二部分的第一部分:是否有任何好的工具(命令行linux和windows,如果可能)轻松删除某些标签中未使用的属性?我知道可以使用XSLT。或者有任何简单的替代方案吗?此外,我可以将它分成三个文件,每个标签一个,以获得以后解析的速度... 对于这种数据准备来说,速度并不是很重要,当然,花费相当于几分钟而不是几小时就会很好。

第二部分:一旦我准备好数据,无论是否缩短,我都应该能够搜索我提到的ID属性,这对时间要求很高。

使用wc -l进行的估算告诉我,有大约3M N标签和大约418K W标签。后者最多可包含大约20个子标签。 W-Tags也包含一些,但它们会被删除。

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

现在的问题是:我应该使用哪种XML解析库进行这种处理?我会首先使用Java 6,并考虑将其移植到BlackBerry。

创建一个索引id并指向文件中偏移量的平面文件可能有用吗?是否有必要进行上部提到的优化?或者已知解析器与原始数据一样快?

小注意:为了测试,我将id放在文件的最后一行,并使用grep搜索id。在Core 2 Duo上花了大约一分钟。

如果文件变得更大,会发生什么?让我们说5 GB?

我感谢任何通知或建议。 非常感谢你们提前和问候

6 个答案:

答案 0 :(得分:4)

正如Bouman指出的那样,将其视为纯文本处理将为您提供最佳速度。

要将其作为XML处理,唯一可行的方法是使用SAX解析器。在SAX解析器中构建的Java API完全能够处理这个,因此不需要安装任何第三方库。

答案 1 :(得分:1)

我正在使用XMLStarlet(http://xmlstar.sourceforge.net/)来处理大量的XML文件。 linux和windows都有版本。

答案 2 :(得分:1)

大型XML文件和Java堆空间是一个棘手的问题。 StAX适用于大文件 - 它肯定可以处理1GB而无需打击眼睑。这里有一篇关于使用StAx的有用文章:XML.com让我在大约20分钟内完成并运行它。

答案 3 :(得分:1)

  

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

也许您应该看看VTD-XML:http://en.wikipedia.org/wiki/VTD-XML(请参阅http://sourceforge.net/projects/vtd-xml/下载)

  

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

我知道这是亵渎,但你有没有考虑awk或grep进行预处理?我的意思是,我知道你实际上不能解析xml并检测嵌套结构中的错误,比如XML,但也许你的XML的形式可能恰好可能吗?

  

我知道可以使用XSLT。或者有任何简单的替代方案吗?

据我所知,XSLT处理器在源文档的DOM树上运行...所以他们需要解析并将整个文档加载到内存中...对于这么大的文档可能不是一个好主意(或者你可能有足够的内存?)有一种叫做流式XSLT的东西,但我认为这种技术很年轻,并没有很多实现,没有免费的AFAIK,所以你可以试试。

答案 4 :(得分:1)

“我可以把它分成三个文件”

试试XmlSplit。它是一个命令行程序,带有用于指定按元素,属性等分割的位置的选项。谷歌和你应该找到它。也很快。

答案 5 :(得分:0)

即使对于大文件,xslt也相对较快。对于大型文件,诀窍不是首先创建DOM。使用URL源或流源传递给转换器。

剥离空节点和不需要的属性从Identity Transform模板开始并过滤掉它们。然后使用XPATH搜索所需的标签。

您还可以尝试一系列变体:

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

  • 当您通过Identity Transform运行XML时,使用它为使用generated-id()函数为每个感兴趣的节点分配UNID。

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