概要
提高文件下载的效率, 或者说处理某个任务的效率, 这篇文章可有所启发
背景
在工作场景中, 老代码下载逻辑简单粗暴,例如使用apache的IOUtils.copy(inputStream,outputStream), 函数简单粗暴,就是将一个流复制到另一个流上面去, 但是,细究其底层原理,效率是非常低下的, 适用于文件不大, 对性能要求不高的场景.
jdk 本身的文件拷贝 output.write(inputStream,outputStream)这种会涉及四次内存拷贝, 这也是计算机系统中经常设计的概念, 包括用户空间和内核空间的切换
apache 的 IOUtils.copy本质上是一个串行操作, 一个文件大小与拷贝时间呈正相关。
使用建议
可以对一个文件进行分片下载, 最后再进行分片的重组.
重组时使用可以使用filestream.getchanel进行拷贝
以下部分是amazen的并行下载部分代码, 是并行下载组装的践行示例
com.amazonaws.services.s3.internal;
in = new FileInputStream(sourceFile).getChannel();
out = new FileOutputStream(destinationFile, true).getChannel();
final long size = in.size();
// In some Windows platforms, copying large files fail due to insufficient system resources.
// Limit copy size to 32 MB in each transfer
final long count = 32 * MB;
long position = 0;
while (position < size) {
position += in.transferTo(position, count, out);
}
技术细节
相关链接:
https://www.cnblogs.com/robothy/p/14235598.html
https://zhuanlan.zhihu.com/p/392695792
https://blog.youkuaiyun.com/Amor_Leo/article/details/117705800