2011-04-04 47 views
3

我有200,000个XML文件需要解析并存储在数据库中。如何在Java中高效地解析200,000个XML文件?

这里是一个示例:https://gist.github.com/902292

这是因为XML文件获取有关复杂。这也将运行在一个小的VPS(Linode)上,所以内存很紧。

我想知道的是:

1)我应该使用DOM和SAX解析器?由于每个XML都很小,因此DOM看起来更简单快捷。

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

感谢

编辑

我想即使大家认为SAX的DOM路线。主要是因为我找到了一个“更容易”的DOM教程,我认为,由于平均文件大小约为3k - 4k,它很容易能够保存在内存中。

但是,我编写了一个递归例程来处理所有200k文件,并且通过它们获得大约40%的方式,然后Java耗尽内存。

这是项目的一部分。 https://gist.github.com/905550#file_xm_lparser.java

我现在应该抛开DOM并且只使用SAX吗?就像这样的小文件,DOM应该能够处理它。

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

谢谢

+0

也许内存问题不是由DOM对象造成的。在这个例子中,你不显示数据库代码。如果您正在使用JDBC,但如果未正确释放,可能会耗尽内存。当您不再引用它们时,Java DOM和其他对象应该被GC'd查找,以查找引用被保存的对象。内存分析器会有所帮助。 – 2011-04-06 13:25:25

+0

实际上还没有数据库代码。 – cbmeeks 2011-04-07 14:09:09

+0

除了DOM和SAX,你看过vtd-xml(http://vtd-xml.sf.net)吗? – 2016-03-26 02:21:45

回答

2

SAX总是以极快的速度击败DOM。但既然你说XML文件很小,你可以继续使用DOM解析器。你可以做的一件事是加速创建一个线程池并在其中执行数据库操作。多线程更新将显着提高性能。

  • Lalith
+0

对于线程池的想法+1。我也会研究。 – cbmeeks 2011-04-05 00:02:48

+0

萨克斯还拥有更好的内存占用。 – MeBigFatGuy 2011-04-05 05:51:14

+0

我接受这个答案,因为我也相信一个好的线程池可以通过这些更快的速度。 – cbmeeks 2011-05-11 11:53:44

2

与SAX一起去吧,或者如果你愿意的话,StAX。忘掉DOM。使用有效的库,如aalto

我相信,与制作数据库请求相比,解析将非常便宜。

但是200k不是这么大的数字,如果你只需要这样做一次。

+0

感谢您的提示。我实际上需要在某个时刻每晚运行一次。但每周甚至每月开始。 – cbmeeks 2011-04-05 00:02:20

+0

在这种情况下,您还可以考虑将数据转换为更有效的存储格式 - 或更有效的数据库导入格式。请参阅https://github.com/eishay/jvm-serializers/wiki/。 - 尽管我建议在数据进入时进行增量更新,而不是夜间工作。 – ThomasRS 2011-04-05 00:09:48

+0

谢谢。但数据的格式是我无法控制的。它每天晚上都会转储到这些200k XML文件中。我只是解析它们并将它们存储在MongoDB中以便可搜索。 – cbmeeks 2011-04-05 12:25:31

0

SAX将比DOM更快,如果你有200,000个文件需要解析,这可能是一个问题。

3

分而治之 分割200000文件分成多个水桶和并行解析/插入。如果您想保持简单或使用spring-batch,请查看Java 5 Executors,如果这是一个反复出现的任务,在这种情况下您可以从高级框架中受益。

API

SAX的使用可以帮助,但不是必要的,因为你不会保持解析模型周围(即你正在做的是分析,插入,然后让被解析数据的走在这时间对象符合GC的条件)。看看一个简单的API,如JDOM

其他想法

您可以实现一个生产者/消费者一种模式,其中生产者生产的POJO的创建解析和消费者采取POJO的,并将其插入到数据库后。这里的优势是你可以通过batch the insert s获得更多的性能。

+0

不错的建议。幸运的是,XML文件被平分为100个文件夹。 – cbmeeks 2011-04-05 00:09:47

4

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

+0

我是MongoDB的粉丝,但我一定会检查一下。一直对学习新东西感兴趣。 – cbmeeks 2011-04-05 12:26:05

0

StAX比SAX更快,这比DOM快得多。如果性能非常关键,您还可以考虑构建一个专用编译器来解析XML文件。但通常Lexing和解析并不是StAX的问题,而是“后处理”。