从 HDFS 下载大文件
Download a large file from HDFS
我从 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()
,结果就是您复制的字节数。
我从 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()
,结果就是您复制的字节数。