XML:处理大数据

您为以下目的推荐的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?

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

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

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

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

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

您为以下目的推荐的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是这样的forms,它可能恰好可能?

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

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

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

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

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

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

你也可以尝试一些变化:

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

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

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