善于利用和应用底层内存拷贝原理和并行思想

本文讨论了传统文件下载方法的低效问题,如Apache的IOUtils.copy存在四次内存拷贝和串行操作。提出通过分片下载并利用Java通道技术,降低内存消耗,提升大文件下载速度。还提供了AmazonS3内部并行下载代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概要

提高文件下载的效率, 或者说处理某个任务的效率, 这篇文章可有所启发

背景

在工作场景中, 老代码下载逻辑简单粗暴,例如使用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

小结

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值