Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中高效解析200000个XML文件?_Java_Xml_Xml Parsing - Fatal编程技术网

如何在Java中高效解析200000个XML文件?

如何在Java中高效解析200000个XML文件?,java,xml,xml-parsing,Java,Xml,Xml Parsing,我有200000个XML文件要解析并存储在数据库中 以下是一个示例: 这与XML文件的复杂性差不多。这也将在小型VPS(Linode)上运行,因此内存非常紧张 我想知道的是: 1) 我应该使用DOM还是SAX解析器?由于每个XML都很小,所以DOM看起来更简单、更快 2) 关于上述解析器的简单教程在哪里?(DOM或SAX) 谢谢 编辑 我尝试了DOM路线,尽管每个人都建议使用SAX。主要是因为我找到了一个关于DOM的“更简单”的教程,我认为由于平均文件大小约为3k-4k,所以可以很容易地将其保存

我有200000个XML文件要解析并存储在数据库中

以下是一个示例:

这与XML文件的复杂性差不多。这也将在小型VPS(Linode)上运行,因此内存非常紧张

我想知道的是:

1) 我应该使用DOM还是SAX解析器?由于每个XML都很小,所以DOM看起来更简单、更快

2) 关于上述解析器的简单教程在哪里?(DOM或SAX)

谢谢

编辑

我尝试了DOM路线,尽管每个人都建议使用SAX。主要是因为我找到了一个关于DOM的“更简单”的教程,我认为由于平均文件大小约为3k-4k,所以可以很容易地将其保存在内存中

然而,我编写了一个递归例程来处理所有200k文件,它大约40%的处理过程都是通过这些文件完成的,然后Java就耗尽了内存

这是项目的一部分。

我是否应该现在放弃DOM而只使用SAX?看起来DOM应该能够处理这么小的文件

此外,速度“足够快”。解析2000个XML文件(在Mongo插入之前)大约需要19秒


谢谢

使用SAX,或者如果您愿意,使用StAX。忘掉DOM吧。使用有效的库,例如

我确信,与发出数据库请求相比,解析将非常便宜


但是,如果您只需要执行一次,那么200k并不是一个很大的数字。

SAX将比DOM快,如果您要解析200000个文件,这很可能是一个问题。

SAX的速度总是比DOM快。但由于您说XML文件很小,所以可以继续使用DOM解析器。要提高速度,可以做的一件事是创建一个线程池并在其中执行数据库操作。多线程更新将显著提高性能

  • 拉利特

分而治之 将200000个文件拆分为多个bucket并并行化解析/插入。看看您是否希望保持它的简单性,或者如果这是一项经常性的任务,您是否可以使用它,在这种情况下,您可以从高级框架中受益

API

使用SAX可能会有所帮助,但不是必需的,因为您不打算保留已解析的模型(即,您所做的只是解析、插入并释放已解析的数据,此时对象符合GC的条件)。查看一个简单的API,如

其他想法


您可以实现生产者/消费者类型的模型,其中生产者生成解析后创建的pojo,消费者获取pojo并将其插入数据库。这里的优点是,您可以s获得更高的性能。

为什么不使用合适的XML数据库(例如)?然后您可以直接转储文档,并根据需要创建索引(例如在
HotelID
上)。

StAX比SAX快,这比DOM快得多。如果性能非常关键,您还可以考虑构建一个特殊的编译器来解析XML文件。但是通常情况下,词法分析和解析对于StAX来说不是什么大问题,而是“后处理”。

谢谢你的提示。实际上,我需要在某个时候每晚跑步。但在开始时,每周或甚至每月。在这种情况下,您也可以考虑将数据转换为更有效的存储格式或更有效的数据库导入格式。见尽管我建议做增量更新,因为数据即将到来,而不是夜间工作。谢谢。但是数据的格式是我无法控制的。它每天晚上都会被转储到这些200k XML文件中。我只是简单地解析它们并将它们存储在MongoDB中以供搜索。如果您将其转换为DB能够理解的文件导入格式(csv等),您可能希望了解性能如何。还有Aalto和多线程的建议。很好的建议。幸运的是,XML文件平均分为100个文件夹。sax也有更好的内存占用。我接受这一点作为答案,因为我也相信一个好的线程池可以更快地完成这些任务。我是MongoDB的超级粉丝,但我一定会去看看。总是对学习新东西感兴趣。也许内存问题不是由DOM对象引起的。在本例中,不显示数据库代码。如果您使用的是JDBC,如果未正确释放,可能会耗尽内存。当不再引用JavaDOM和其他对象时,应该对它们进行GC处理,以便查找被引用的对象。内存分析器会有所帮助。实际上还没有数据库代码。