我知道有一些非常好的Perl XML解析器,如XML::Xerces,XML::Parser::Expat,XML::Simple,XML :: RapidXML,XML::LibXML,XML::Liberal等
您将选择哪个XML解析器来解析大文件以及您将选择哪个参数而不是另一个?如果您要选择的那个不在列表中,请建议。
答案 0 :(得分:14)
如果你正在解析那个大小的文件,你会想要避免任何试图在内存中加载整个文档并构造一个DOM(域对象模型)的解析器。
相反,寻找一个SAX样式解析器 - 将输入文件视为流,在遇到事件和属性时引发事件。这种方法允许您逐步处理文件,而不必立即将整个内容保存在内存中。
答案 1 :(得分:9)
使用15 GB的文件,您的解析器必须是基于SAX的,因为有了这样的文件大小,只需能够处理数据就是您的首要任务。
我建议你阅读XML::SAX::Intro。
答案 2 :(得分:5)
SAX解析器是一种选择。其他不涉及将整个文档加载到内存中的选项是XML::Twig和XML::Rules。
答案 3 :(得分:4)
为了解析这些文件,我总是使用XML::Parser。简单,随处可访,运作良好。
答案 4 :(得分:3)
您还可以考虑使用带有XML扩展的数据库(有关示例,请参阅here)。您可以将XML数据批量加载到数据库中,然后可以对该数据执行SQL查询(或XQueries)。
答案 5 :(得分:3)
正如您所料,我会建议使用XML::Twig,这样可以让您逐块处理文件。当然,这假设您可以通过这种方式处理文件。它可能比SAX更容易使用,因为您可以使用类似DOM的方法为每个块处理树。
另一种方法是使用pull parser mode,这与XML :: Twig提供的有点类似。
答案 6 :(得分:2)
我要去上面的tster答案的变异版本。将血腥的东西加载到DB中(如果可能,通过直接XML导入,如果没有,通过使用SAX解析器来解析文件并生成可加载的数据集)。然后,使用DB作为数据存储。在15G,你正在超越应该在DB之外操作的数据大小。