哪个更适合处理Java中的大文件 - XML或序列化文件?

时间:2015-08-13 20:56:35

标签: java xml serialization xml-parsing

我有一个巨大的文件(3GB +)作为XML。目前,我在我的Java代码中读取XML,解析它并存储在HashMap中,然后将HashMap用作查找。 对于此代码的每次运行,此过程在1000个不同的JVM中完成大约1000次。 1000个不同的JVM在1000个输入数据分区上运行,因此这个过程必须发生1000次。

我想知道作为一次性活动,如果我序列化HashMap然后存储输出。然后在java程序中只需反序列化HashMap并避免解析XML文件1000次。

这会帮助加快代码的速度吗?或序列化开销是否会使任何收益无效?

编辑: 1. 1000个不同的JVM在1000个输入数据分区上运行,因此这个过程必须发生1000次。

4 个答案:

答案 0 :(得分:1)

您可以考虑使用Chronicle Map。它可以在off堆内存中加载一次,并在多个JVM之间共享,而不必反序列化它。即它使用非常少的堆,您只需要阅读map.get(key)

条目

它通过内存映射文件来工作,因此一旦第一个程序将其加载到内存中,您就不会多次支付加载它的价格,即使没有程序使用它也可以保留在内存中。

免责声明:我帮忙写了它。

答案 1 :(得分:0)

为什么要加载和解析相同的地图1000次?如果没有别的,你可以复制你加载的第一个,以避免从磁盘读取另外3GB +。

答案 2 :(得分:0)

序列化文件很可能会更快,但是没有保证。唯一可以确定的方法是让您在您的机器上进行尝试并对其进行基准测试以衡量差异。请注意JIT预热等所有问题,以便获得良好的基准测试结果。

获得良好性能的最佳方法是读取文件一次并将其保存在内存中。这样做有很多开销,但是如果你经常打电话那就值得。你应该考虑将数据库用于这样的事情,你总是可以使用在本地运行的轻量级数据库。

答案 3 :(得分:0)

根据我的经验,我认为序列化XML的最佳格式是XML。 XML表示通常小于Java序列化的输出,因此加载速度更快。但试试看。

除非您的处理是高度分散的(例如,在没有共享内存的群集上),否则我不清楚您需要序列化分区的原因。

使用Saxon-EE,您可以进行如下处理:

lblhello.Text = hello.Text.Substring(0, hello.Text.Length - 1)

函数f:process-one-partition可以用Java或XSLT编写。

此处所需的内存将是线程数*一个分区大小的顺序。

相关问题