【问题标题】:Which is better for processing a huge file in Java - XML or Serialized file?哪个更适合处理 Java 中的大文件 - XML 或序列化文件?
【发布时间】:2015-08-13 20:56:35
【问题描述】:

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

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

这会大大加快代码速度吗?还是序列化开销会抵消任何收益?

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

【问题讨论】:

  • 你为什么一遍又一遍地阅读它?阅读一遍,保持HashMap 可用。
  • 或者批量读取一次,然后放入数据库之类的合理的东西中。
  • 数据的形状是什么?是流式传输还是您真的需要查看整个文件才能开始计算?
  • 你为什么使用 1000 个 JVM,而不是单个 JVM 中的 1000 个线程?还是针对机器上的 CPU 数量优化的线程池?

标签: java xml serialization xml-parsing


【解决方案1】:

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

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

免责声明:我帮助编写了它。

【讨论】:

  • 嗯,有趣!我觉得当我阅读它时我会学到一些东西:p
  • @Dici 你可以阅读源代码。注意:您可以在任何 JVM 中更新 Map 并查看其他 JVM 中的更改。它还支持复制和远程访问。
【解决方案2】:

为什么要加载和解析同一张地图 1000 次?如果不出意外,您可以只复制您加载的第一个副本,以避免从磁盘读取另外 3GB+。

【讨论】:

  • 好吧,我假设他不想在堆上拥有超过 3 GB 的内存......这完全有道理。实际上,拥有这个HashMap 的事实可能很糟糕。数据应流式传输以使用常量内存
【解决方案3】:

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

获得良好性能的最佳方法是读取文件一次并将其保存在内存中。这样做会产生开销,但如果您经常调用它,那将是值得的。你真的应该考虑使用数据库来做这样的事情,你总是可以使用在本地运行的轻量级数据库。

【讨论】:

    【解决方案4】:

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

    我不清楚为什么您需要对分区进行序列化,除非您的处理是高度分布式的(例如,在没有共享内存的集群上)。

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

    <xsl:template name="main">
      <xsl:stream href="big-input.xml">
        <xsl:for-each select="/*/partition" saxon:threads="50">
          <xsl:sequence select="f:process-one-partition(copy-of(.))"/>
        </xsl:for-each>
      </xsl:stream>
    </xsl:template>
    

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

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

    【讨论】:

      猜你喜欢
      • 2012-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多