java面试 上传文件_字节跳动面试官,我也实现了大文件上传和断点续传
前言
前几天看到一个文章,感触很深
作者从0实现了大文件的切片上传,断点续传,秒传,暂停等功能,深入浅出的把这个面试题进行了全面的剖析
彩虹屁不多吹,我决定蹭蹭热点,录录视频,把作者完整写代码的过程加进去,并且接着这篇文章写,所以请看完上面的文章后再食用,我做了一些扩展如下
计算hash耗时的问题,不仅可以通过web-workder,还可以参考React的FFiber架构,通过requestIdleCallback来利用浏览器的空闲时间计算,也不会卡死主线程
文件hash的计算,是为了判断文件是否存在,进而实现秒传的功能,所以我们可以参考布隆过滤器的理念, 牺牲一点点的识别率来换取时间,比如我们可以抽样算hash
文中通过web-workder让hash计算不卡顿主线程,但是大文件由于切片过多,过多的HTTP链接过去,也会把浏览器打挂 (我试了4个G的,直接卡死了), 我们可以通过控制异步请求的并发数来解决,我记得这也是头条的一个面试题
每个切片的上传进度不需要用表格来显示,我们换成方块进度条更直管一些(如图)
并发上传中,报错如何重试,比如每个切片我们允许重试两次,三次再终止
由于文件大小不一,我们每个切片的大小设置成固定的也有点略显笨拙,我们可以参考TCP协议的慢启动策略, 设置一个初始大小,根据上传任务完成的时候,来动态调整下一个切片的大小, 确保文件切片的大小和当前网速匹配
小的体验优化,比如上传的时候
文件碎片清理
已经存在的秒传的切片就是绿的,正在上传的是蓝色的,并发量是4,废话不多说,我们一起代码开花
时间切片计算文件hash
其实就是time-slice概念,React中Fiber架构的核心理念,利用浏览器的空闲时间,计算大的diff过程,中途又任何的高优先级任务,比如动画和输入,都会中断diff任务, 虽然整个计算量没有减小,但是大大提高了用户的交互体验
requestIdleCallback
window.requestIdleCallback()方法将在浏览器的空闲时段内调用的函数排队。这使开发者能够在主事件循环上执行后台和低优先级工作
requestIdelCallback执行的方法,会传递一个deadline参数,能够知道当前帧的剩余时间,用法如下
requestIdelCallback(myNonEssentialWork);
function myNonEssentialWork (deadline) {
// deadline.timeRemaining()可以获取到当前帧剩余时间
// 当前帧还有时间 并且任务队列不为空
while (deadline.timeRemaining() > 0 && tasks.length > 0) {
doWorkIfNeeded();
}
if (tasks.length > 0){
requestIdleCallback(myNonEssentialWork);
}
}
复制代码
deadline的结构如下
interface Dealine {
didTimeout: boolean // 表示任务执行是否超过约定时间
timeRemaining(): DOMHighResTimeStamp // 任务可供执行的剩余时间
}
复制代码
该图中的两个帧,在每一帧内部,TASK和redering只花费了一部分时间,并没有占据整个帧,那么这个时候,如图中idle period的部分就是空闲时间,而每一帧中的空闲时间,根据该帧中处理事情的多少,复杂度等,消耗不等,所以空闲时间也不等。
而对于每一个deadline.timeRemaining()的返回值,就是如图中,Idle Callback到所在帧结尾的时间(ms级)
时间切片计算
我们接着之前文章的代码,改造一下calculateHash
async calculateHashIdle(chunks) {
return new Promise(resolve => {
const spark = new SparkMD5.ArrayBuffer();
let count = 0;
// 根据文件内容追加计算
const appendToSpark = async file => {
return new Promise(resolve => {
const reader = new FileReader();
reader.readAsArrayBuffer(file);
reader.onload = e => {
spark.append(e.target.result);
resolve();
};
});
};
const workLoop = async deadline => {
// 有任务,并且当前帧还没结束
while (count < chunks.length && deadline.timeRemaining() > 1) {
await appendToSpark(chunks[count].file);
count++;
// 没有了 计算完毕
if (count < chunks.length) {
关于找一找教程网
本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。
本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。
[字节跳动面试官,我也实现了大文件上传和断点续传]http://www.zyiz.net/tech/detail-109137.html
java面试 上传文件_字节跳动面试官,我也实现了大文件上传和断点续传相关推荐
- 多路归并排序_字节跳动面试:5 亿整数的大文件,如何排序 ?
最近,面试头条,面试官一上来,就问了我这么一个问题,我一脸懵逼,决定记录一下. 问题 给你1个文件bigdata,大小4663M,5亿个数,文件中的数据随机,如下一行一个整数: 6196302 355 ...
- 面试字节跳动测试岗位一般问什么测试点_字节跳动面试问题集合
2020年秋招字节成都用户产品一面 1. 之前三段实习经历分别有什么收获 2. 为什么想做产品经理 3. 描述之前在美团的实习做了什么,并挑一个做的最好的功能讲一讲 4. 用三个词描述美团的工作氛围 ...
- Java大象进冰箱线程_把大象装进冰箱:HTTP传输大文件的方法
上次我们谈到了HTTP报文里的div,知道了HTTP可以传输很多种类的数据,不仅是文本,也能传输图片,音频和视频. 早期互联网上传输的基本上都是只有几k大小的文本和小图片,现在的情况则大有不同.网页里 ...
- 字节跳动一面通过率_字节跳动面试(一面)总结
其实这篇总结很早以前就开始写了--去年11月底就面的头条,只是由于总总原因没有完成,趁现在假期补上. 面试用的是ZOOM视频会议,这里提醒大家视频面试前现检查网络情况如何!一定要保证非常流畅,不然等等 ...
- 面试字节跳动测试岗位一般问什么测试点_字节跳动校招流程详解(附带笔试真题+面经)...
相信大家对字节跳动不会陌生,旗下有抖音.今日头条.西瓜视频等优质产品.它于7月20日开启校招,目前已经进入了尾声阶段,想要投递的同学一定不要错过了! 点击即可跳转--字节跳动校招官网 一.招聘对象 在 ...
- 字节跳动面试总结-3.18
字节跳动面试总结 字节跳动是全球第一家将人工智能应用到主产品的科技公司.全系产品矩阵包括今日头条.抖音.西瓜视频.火山小视频.TopBuzz.Faceu激萌.图虫.懂车帝等多款产品.截止2019年1月 ...
- 字节跳动面试,倒在了终面上
字节跳动面经 版权©: https://blog.csdn.net/zhangjingao/article/details/97176702 字节跳动一面 这个面试官不是搞java的,后来告诉我字节跳 ...
- 2021 字节跳动面试参考手册(第一期)!!!权威来袭~~~
2021 字节跳动面试参考手册(第一期) 一.Java 基础面试题 1.String 能被继承吗?为什么? 不可以,因为 String 类有 final 修饰符,而 final 修饰的类是不能被继承的 ...
- 字节跳动面试算法题目以及答案
题目来源于牛客 https://www.nowcoder.com/discuss/455003?type=post&order=time&pos=&page=2&cha ...
最新文章
- __cplusplus的用处
- 不好意思,这么久没有更新《从零开始掌握ASP.NET Core 》
- LeetCode上读不懂题!看不懂测试用例的那些题(有生之年更新。。。)
- raw_input() 与 input() __ Python
- 宜家:打造新零售时代的智能客户身份管理系统
- PAT1002. 写出这个数
- 大数据安全分析需要关注哪些问题
- OBS美颜滤镜插件(BF+)——OBS美颜解决办法
- C语言数据结构队列的插入和删除
- 还原文件打开方式为未知应用程序
- 中国移动 烽火HG6543C5光猫 获取超级密码教程
- 企业微信登录报错:应用程序无法正常启动(0xc0000142);Win10应用程序无法正常启动0xc0000142错误的解决方法
- web网页设计期末课程大作业——简单的学生网页作业源码 基于HTML仿唯品会电商项目的设计与实现
- Python极简实现IoU
- QT之 QSQLite
- 基于WiFi6路由器搭建AGV运输车控制网络
- outlook导出邮件(.msg)读取和解析
- android 标注 比例换算,android APP UI设计图标注、换算
- java饲养员喂动物_你真的想当一名动物饲养员?
- SuperSet (真)完全汉化