今天碰到一个上传较大的视频文件到S3引发闪退的问题。经查此问题产生的原因是内存溢出,连个闪退日志都没有。

这个上传使用的是第三方的插件,我是用 uploadFileStream 来上传文件的,查看其实现代码,它使用的是http插件的 http.StreamedRequest, 它会把文件分块读出来,添加分块签名,再使用 request.sink.add(xxx) 加入缓冲区, 最后调用 request.send() 来完成发送。

这样问题就来了,它会把整个文件外加签名信息都放到缓冲区,意味着文件越大,也就占用更多的内存,最终导致崩溃的发生。

由于需要对文件进行签名处理,不能直接使用 dio 插件文件上传方式(说不定dio也会有同样的问题,还没来得及细品)。http 插件也没有提供边读边处理边发送的方法,问题限入卡顿状态,在网上搜索半天也没有找到一个解决方案,最后想想,能不能直接用最基础的 HttpClient 来解决呢?

因为平常主要用dio和http这两个插件,没有用过HttpClient,没有认真研究过它。这个时候想起来它,就马上细品起来,最终真的找到的解决方案。还真是越低级的封装,关键时候越能解决问题。

下面给出使用 HttpClient 解决上面问题的关键代码:

//初始化一个Http客户端,并加入自定义Header

var req =await HttpClient().putUrl(uri);

headers.forEach((key, value) {

req.headers.add(key, value);

});//读文件

var s =await file.open();var x = 0;var size =file.lengthSync();var chunkSize = 65536;while (x = chunkSize ? chunkSize : size -x;

val=s.readSync(_len).toList();

x= x +_len;//处理数据块

val =proc(val);//加入http发送缓冲区

req.add(val);//立即发送并清空缓冲区

await req.flush();

}

await s.close();//文件发送完成

await req.close();//获取返回数据

final response =await req.done;//其它处理逻辑

print("response statusCode: ${resp.statusCode}");

经测试,用上面方法上传大文件,内存占用平稳,最后真机测试,也没有再闪退。

原文:https://www.cnblogs.com/yangyxd/p/13094925.html

html大文件占用内存,[Flutter] 大文件上传之随传随处理(避免占用大量内存)相关推荐

  1. Spark 中 JVM 内存使用及配置详情、spark报错与调优、Spark内存溢出OOM异常

    一般在我们开发spark程序的时候,从代码开发到上线以及后期的维护中,在整个过程中都需要涉及到调优的问题,即一开始需要考虑如何把代码写的更简洁高效调优(即代码优化),待开发测试完成后,提交任务时综合考 ...

  2. 【PCB】关于PCB文件占用内存过大的处理方法

    有时候一块很小面积的PCB,占用内存高达10M,20M,只需要做一下步骤,即可使PCB内存减小为1M,2M. 主要是因为字体兼容导致占用内存过大,只需要把字符改为非兼容模式即可. AD15:Prefe ...

  3. 一招修复内存不能read_read文件一个字节实际会发生多大的磁盘IO?

    先讲一个作者大约5-6年前我在某当时很火的一个应用分发创业公司的面试小插曲,该公司安排了一个刚工作1年多的一个同学来面我,聊到我们项目中的配置文件里写的一个开关,这位同学就跳出来说,你这个读文件啦,每 ...

  4. 【JavaNIO的深入研究4】内存映射文件I/O,大文件读写操作,Java nio之MappedByteBuffer,高效文件/内存映射...

    内存映射文件能让你创建和修改那些因为太大而无法放入内存的文件.有了内存映射文件,你就可以认为文件已经全部读进了内存,然后把它当成一个非常大的数组来访问.这种解决办法能大大简化修改文件的代码. file ...

  5. 如何做看到总服务器的文件,怎么看到服务器大内存文件夹

    怎么看到服务器大内存文件夹 内容精选 换一换 本文总结了常用的Linux内核参数,以及Linux内核参数的查看.修改方法.如果您的业务未受到影响,建议不要执行修改内核参数的操作.如需调整,请确保:从实 ...

  6. java内存中读文件_关于内存管理:读取Java中的大文件

    我需要一个非常了解Java和内存问题的人的建议. 我有一个大文件(大约1.5GB),我需要将此文件切成许多小文件(例如100个小文件). 我通常知道如何做到这一点(使用BufferedReader), ...

  7. PDF内存太大怎么压缩?三个方法教你如何压缩PDF文件

    遇到PDF内存很大的文件时,想要压缩该怎么压缩呢?PDF文件是大家在办公中离不开的一种文件格式,同事以及领导之间传输文件基本都会使用PDF文件.用的多了自然储备的文件数量也就多了起来,整理到一起非常占 ...

  8. windows系统 如何管理hiberfil.sys文件与pagefile.sys文件释放C盘 (powercfg -h off)存储空间不足、内存、大文件、SpaceSniffer

    文章目录 20220224 c盘不知为啥莫名其妙就没空间了,我一运行压缩程序 winrar 没一会电脑就自动重启,而且重启要等待很长时间,后来我用 SpaceSniffer 查了一下发现一个 hibe ...

  9. java并发读取相同的文件_高效读取大文件,再也不用担心 OOM 了!

    最近阿粉接到一个需求,需要从文件读取数据,然后经过业务处理之后存储到数据库中.这个需求,说实话不是很难,阿粉很快完成了第一个版本. 内存读取 第一个版本,阿粉采用内存读取的方式,所有的数据首先读读取到 ...

最新文章

  1. C++面向接口编程和C++多态
  2. Hash冲突的解决--暴雪的Hash算法
  3. JavaScrip入门-变量计算%函数
  4. 投入20亿,赋能1万家,阿里云正式启动云原生合作伙伴计划
  5. python怎么批量处理数据_python如何批量处理excel数据?_后端开发
  6. nodejs进入mysql数据库_nodejs简单访问及操作mysql数据库的方法示例
  7. .Net中委托的协变和逆变详解
  8. oracle 替换全部空格
  9. 清华霸榜,长沙理工异军突起!第三届 CCF CCSP落下帷幕
  10. 马斯洛需求的五个层次_运用马斯洛需求层次理论分析《吞噬星空》爽点之第九章...
  11. Mysql 的uuid()函数以及replace()函数使用
  12. 李航博士:《统计学习方法》第二版上线啦!增加无监督学习!
  13. 投影仪开关机码和波特率
  14. VC编程读取文本数据
  15. Edge浏览器或使用谷歌chrome内核的浏览器访问网页版高德地图很卡特别慢解决办法
  16. imo教我们的互联网思维9大玩法
  17. 基线_项目管理之答疑解惑:基准与基线??
  18. 交互器、linux下的常用命令
  19. 推荐一个制作卡通头像的网站(超强)
  20. 常微分方程 知识结构

热门文章

  1. 哈佛牙学院博士后:教你口腔保健基本功之刷牙篇
  2. 扩增子统计绘图1箱线图:Alpha多样性
  3. python使用matplotlib可视化线图(line plot)、在可视化图像中的指定位置添加横线(add horizontal line in matplotlib plot)
  4. R语言使用caret包的preProcess函数进行数据预处理:对所有的数据列进行YeoJohnson变换(将非正态分布数据列转换为正态分布数据、可以处理负数)、设置参数为YeoJohnson
  5. R语言ggplot2可视化:可视化所有日期不同时段任务的持续时间、将持续时间绘制成一条线(起始时间到结束时间),y轴表示活动发生的日期,x轴表示以小时为单位的时间
  6. R语言使用ggplot2包的快速可视化函数qplot绘制散点图(添加平滑曲线与标准差带)实战
  7. R语言使用ggplot2包使用geom_dotplot函数绘制分组点图(添加均值、中位数)实战(dot plot)
  8. R语言data.table进行滚动数据连接,滚动联接通常用于分析涉及时间的数据实战(动画说明滚动数据连接的形式):rolling joins data.table in R
  9. R语言在直方图条(柱形)上添加计数(count)或者百分比(percent)标签
  10. Pandas批量删除dataframe列名中的后缀实战:使用rstrip函数批量删除列名中的后缀(suffix)、使用replace函数批量删除列名中的后缀(suffix)