今天碰到一个上传较大的视频文件到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. 最全的 Spring 依赖注入方式,你都会了吗?
  2. IronRuby - 如何在VS2010下调试IronRuby代码
  3. 12 HTML5中的影音播放
  4. 你不知道的 JavaScript 笔记——作用域和闭包
  5. 京东:Flink SQL 优化实战
  6. ubuntu16.04下面使用graphviz
  7. CF446D-DZY Loves Games【高斯消元,矩阵乘法】
  8. 语言程序设计第4版黄洪艺_庞皓计量经济学第4版题库
  9. 千万不要手贱在win10系统上执行win7激活工具!!!
  10. 基于python生成手写的笔记
  11. android计算器实现sin功能,android studio实现简单的计算器功能
  12. et200sp系统服务器模块,ET200SP GSD文件组态时服务器模块的选择方法
  13. kali启动后出现Resuming from hibernation错误
  14. 树莓派教程 - 1.5 树莓派GPIO库wiringPi 使用硬件串口ttyAMA0与ttyS0
  15. 使用 HTML CSS 和 JavaScript 创建星级评分系统
  16. 怎么把照片改成一寸照?教你把照片改成一寸照的方法
  17. 动词语气(虚拟语气)
  18. 计算机应用基础考查方案,《计算机应用基础》考查方案
  19. 计算机报名照片在线修图,2020河北省考报名照片处理工具及使用说明
  20. centos7下mediainfo安装与使用

热门文章

  1. 一些你可能忽略的护牙小技巧
  2. ggplot2笔记2:图层的使用——基础、怎样加标签、注释
  3. R语言基于Bagging算法(融合多个决策树)构建集成学习Bagging分类模型、并评估模型在测试集和训练集上的分类效果(accuray、F1、偏差Deviance):Bagging算法与随机森林对比
  4. R语言ggplot2可视化在时间序列上标注出重点区域实战(突出特定的时间范围):highlight specific time ranges
  5. ModuleNotFoundError: No module named ‘cx_Oracle‘
  6. 异常检测算( OneClassSVM、EllipticEnvelope、IsolationForest、LocalOutlierFactor)法比较,基于四个仿真数据集
  7. Read correction for non-uniform coverages 读校正非均匀覆盖
  8. # 关闭 window10自带广告 microsoft star
  9. java普通项目打包成exe可执行文件
  10. VMware虚拟机搭MAC系统