【问题标题】:Efficient bulk data transfer through I/O in Java通过 Java 中的 I/O 进行高效的批量数据传输
【发布时间】:2010-07-09 19:02:33
【问题描述】:

Java 中是否有一种有效的机制可以在低端机器上的磁盘和网络之间来回传输大量数据(约 10 GB)?低端机器是指主存远低于 10 GB 的机器。我想有效地将​​文件的约 10GB 部分从一台机器传输到另一台机器。

【问题讨论】:

  • 这个数据,他们是不是马上需要?如果没有,那么您可以设置一个代理对象,现在为他们提供一些数据,然后在幕后慢慢加载。这并没有解决您问题的核心,但它为您提供了一些其他探索途径。
  • 天啊。现在小于 10 GB 的 RAM 被认为是低端的?

标签: java file file-io io


【解决方案1】:

Java 中最有效的 I/O 方法是 NIO 库。如果您的数据合适,应用压缩流过滤器也会有所帮助。

【讨论】:

  • 另外,只有在网络绑定时才值得压缩。如果网络足够快,则收益会小得多(没有节省时间)。
  • 这就是为什么我说如果您的数据合适,文本尤其可以很好地压缩并且确实可以节省时间,即使连接速度很快。已经压缩的JPG之类的东西不会。无论网络速度如何,在适当的时候压缩总是可以节省时间。
【解决方案2】:

我认为您只需将 InputStream 复制到 OutputStream。我会先使用别人的实现commons-io:IOUtils.copyLarge(InputStream,OutputStream)

InputStream is = null;
OutputStream os = null;
try{
    InputStream is = new FileInputStream("yourfile.bin");
    OutputStream os = remoteSocket.getOutputStream();
    IOUtils.copyLarge(is,os);
}finally{
    IOUtils.closeQuietly(is);
    IOUtils.closeQuietly(out);
}

这应该是十个人的良好开端。如果您需要更高的吞吐量,您可以开始我将读取和写入操作放在单独的线程中,这在理论上应该确保您完全饱和最慢的链接,但是如果使用 FileChannel#transferTo 方法可能是更好的选择使用传统的东西是不够的。

【讨论】:

    【解决方案3】:

    仅供参考,在 java 6 中,transferTo() 仅在文件之间进行优化,而不是文件套接字

    【讨论】:

      【解决方案4】:

      传统的套接字和文件 io 就可以了。

      据我所知,在 java 6 中,没有直接的文件套接字 io 优化。

      即使有,正如 Java 7 中传闻的那样,它也不会大大提高性能。您的代码将是磁盘绑定或网络绑定。内存副本无关紧要。

      【讨论】:

      • 我同意 - 你肯定会受到网络或磁盘带宽的限制。处理速度通常比 I/O 快几个数量级。
      • transferTo() 方法从 Java 1.4 开始就已经存在,所以这个答案是错误的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      • 2019-06-10
      • 2016-12-26
      • 2017-11-28
      相关资源
      最近更新 更多