【问题标题】:What is the fastest way to output a large amount of data?输出大量数据的最快方法是什么?
【发布时间】:2011-03-08 15:39:24
【问题描述】:

我有一个 JAX-RS Web 服务,它调用 db2 z/os 数据库并在结果集中返回大约 240mb 的数据。然后,我正在创建一个 OutputStream,通过循环遍历结果集并为我的输出添加一些 XML 标记来将此数据发送到客户端。

我对使用 PrintWriter、BufferedWriter 或 OutputStreamWriter 感到困惑。我正在寻找传递数据的最快方式。我也不希望 JVM 保留这些数据的时间超过它需要的时间,所以我不会用完它的内存。

感谢任何帮助。

【问题讨论】:

    标签: java jakarta-ee jersey jax-rs weblogic-10.x


    【解决方案1】:

    你应该使用

    1. BufferedWriter
    2. 经常调用 .flush()
    3. 启用 gzip 以获得最佳压缩效果
    4. 开始考虑一种不同的方法。你的数据可以分页吗?您是否需要一个请求中的所有数据。

    【讨论】:

      【解决方案2】:

      如果您要发送大型二进制数据,您可能不想使用 xml。当使用xml时,二进制数据通常使用base64来表示,它变得比原始二进制更大并且使用相当多的CPU来转换为base64。

      如果我是你,我会发送与 xml 分开的二进制文件。如果您使用 WebService,MTOM 附件可能会有所帮助。否则,您可以将引用发送到 xml 中的二进制数据,然后让 app.单独下载二进制数据。

      至于发送二进制文件的最快方式,如果您使用的是 weblogic,只需在响应的输出端上写就可以了。该输出流很可能是缓冲的,无论您做什么都可能不会改变性能。

      根据您发送的内容,打开 gzip 也可能有所帮助(例如,如果您发送 jpeg(已经压缩的内容)或其他内容,它不会有太大帮助,但如果您发送原始文本,那么它会有所帮助很多,等等)。

      【讨论】:

      • 我只发送纯文本 xml
      • @Pete:我明白了。我认为在这种情况下打开 gzip 会有所帮助。
      【解决方案3】:

      一种解决方案(可能不适合您)是生成一个创建文件的作业/线程,然后在文件准备好下载时通知用户,这样您就不会受到带宽的束缚客户端连接(您甚至可以在客户端下载之前正确压缩文件)

      一些商业智能和数据处理应用程序会这样做,特别是如果该过程需要一些时间来生成数据。

      【讨论】:

        【解决方案4】:

        输出最大速度将受到网络带宽的限制,我相信任何 Java OutputStream 都会比您注意到的差异快得多。

        选择取决于要发送的数据:是文本(行)PrintWriter 是容易的,是字节数组采取OutputStream。

        要在缓冲区中保存太多数据,您应该调用 flush() 任何 x kb。

        【讨论】:

          【解决方案5】:

          您不应该使用 PrintWriter 通过网络输出数据。首先,它创建了依赖于平台的换行符。其次,它会静默捕获所有 I/O 异常,这让您很难处理这些异常。

          如果您将 240 MB 作为 XML 发送,那么您肯定做错了什么。在您开始担心要使用哪个流类之前,请尝试减少数据量。

          编辑:

          关于 PrintWriter(和 PrintStream)的建议来自Elliotte Rusty Harold 的一本书。我不记得是哪一个了,但那是几年前的事了。我认为 ServletResponse.getWriter() 是在那本书写完之后添加到 API 中的——所以看起来 Sun 没有遵循 Rusty 的建议。我仍然认为这是一个很好的建议——出于上述原因,并且因为它可以吸引实现作者violate the API contract 为了获得可预测的行为。

          【讨论】:

          • 有趣,您有关于不通过网络使用 PrintWriter 的参考吗?我所有的 servlet 从 ServletResponse.getWriter() 写入 PrintWriter。
          • 我认为 24​​0MB 的 XML 对于每月调用一次的服务来说并不过分。
          • @PeterMmm:好点,见我上面的编辑。 @Pete:如果不是太多,你为什么要优化它?我只是指出可能有更好的优化目标。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-09-10
          • 1970-01-01
          • 2013-03-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-22
          相关资源
          最近更新 更多