我从HDFS客户端获得了一个大文件(大约2GB)的DataInputStream,我需要将其作为文件存储在主机上。
我正在考虑使用apache通用IOUtils并执行类似的操作...
File temp = getTempFile(localPath);
DataInputStream dis = HDFSClient.open(filepath); // around 2GB file (zipped)
in = new BufferedInputStream(dis);
out = new FileOutputStream(temp);
IOUtils.copy(in, out);
我一直在寻找其他解决方案,这些解决方案比这种方法更有效。为此,主要要考虑的是在输入和IOUtils.copy中都使用缓冲。
最佳答案
对于大于2GB的文件,建议使用IOUtils.copyLarge()
(如果我们谈论的是相同的IOUtils:org.apache.commons.io.IOUtils)
IOUtils中的副本使用默认的缓冲区大小4Kb(尽管您可以将另一个缓冲区大小指定为参数)。copy()
和copyLarge()
之间的区别是返回结果。
对于copy()
,如果流大于2GB,则复制成功,但结果为-1。
对于copyLarge()
,结果恰好是您复制的字节数。
在此处查看更多文档:
http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/IOUtils.html#copyLarge(java.io.InputStream,%20java.io.OutputStream)
关于java - 从HDFS下载大文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31824598/