急急急,求java上传大文件占用jvm过高的问题解决方案/思路

一米阳光zw
Java领域优质创作者
博客专家认证
2020-09-14 09:18:06
项目中使用multipart文件上传视频文件到服务器上,然后用fastdfs保存到数据库中。
发现当上传的视频文件太大的时候会使服务器内存的buf/cache占用很高(好几个G),
虽然可以手动清除,但是依旧无法解决视频太大的问题,所以想请教各路大神有
没有什么办法可以解决大文件上传时的内存占用过高的问题。期间我也找过
很多类似的像memory-mapped file还有upload 6 上传,但存储原理不一样所以
个人感觉内存占用还是会很高。我已经找了一天了,希望大神留下来花几分钟
指点指点,不慎感激!!!
...全文
3515 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
一米阳光zw 2020-09-16
  • 打赏
  • 举报
回复
引用 10 楼 一米阳光zw 的回复:
在这里差不多要结贴了,特此总结一下解决方式: 1、mmf,通过memory mapped file 内存映射文件将数据分段存储到mysql或者其他数据库中,不适合,略 2、服务器上ftp,然后通过代码来借助ftp实现 3、lz的解决方式:前端通过vue-upload来实现文件的分片上传功能,后端使用fastdfs自带的分片功能实现数据存储,具体demo可以查看lz个人下载里面的内容
至于如何实现分片的话,可以查看lz写的帖子,:java实现大文件分片上传功能(前后端都有,代码down下来配置完后可以直接运行) https://blog.csdn.net/qq_42910468/article/details/108607427
一米阳光zw 2020-09-16
  • 打赏
  • 举报
回复
至于如何实现分片的话,可以查看lz写的帖子,:java实现大文件分片上传功能(前后端都有,代码down下来配置完后可以直接运行) https://blog.csdn.net/qq_42910468/article/details/108607427
一米阳光zw 2020-09-15
  • 打赏
  • 举报
回复
引用 2 楼 shuangmu9768 的回复:
后台将文件切割存储吧,fastdfs对大文件也不友好的。 或者前端分割上传吧。
后台切割上传那不是就失去了分片的意义了吗,因为如果后台分的话那数据已经加载在内存中,占用了对应大小的内存
冰思雨 2020-09-15
  • 打赏
  • 举报
回复
哦。忘记了,要想实现断点续传功能,最好还要有一个与上传文件相对应的MD5码进行文件的完整性校验。
冰思雨 2020-09-15
  • 打赏
  • 举报
回复 1
楼主自己写代码来接收上传的大文件即可。 如果没有用框架的话,自己写一个Servlet来接收大文件即可。 外面没有可以使用的插件的原因是,web项目极少用来传输大文件,大文件一般都用FTP来传输了。 所以,没有现成的,那就自己写一个。个人觉得,不会太复杂。 1. 找到操作系统指定的临时文件夹,创建临时文件。(要确保临时文件夹有地方存放大文件,多个大文件,系统定期会清理这个文件夹,给硬盘瘦身) 2. 编写处理multipart类型的IO操作的服务端代码(Servlet, Action, Controller等),将发送的文件名,大小,和文件数据保存到临时文件中。 3. 传输完毕后,将临时文件移动到目标文件夹中。 4. 任何失败的情况下,删除临时文件,帮助系统进行瘦身。 另外,断点续传功能相对复杂一点点,不过,只要有耐心,就能搞定,因为技术难度不高,就是稍微复杂一点而已。
一米阳光zw 2020-09-15
  • 打赏
  • 举报
回复
引用 1 楼 tianfang 的回复:
上传大文件,java使用内存而不是磁盘做缓存,如果增加内存容易,(自己的服务器花不了多少多少钱,租用云服务器就可怕了),不妨就高内存跑着 解决方案是:客户端增加js组件 ,分块传送 。 看看你的贴子的推荐文章,都是大文件上传方案
嗯嗯,目前打算使用fastdfs分片上传,前端用webupload.js,但感觉还挺挺复杂的,请问您有做过相关开发吗
shuangmu9768 2020-09-15
  • 打赏
  • 举报
回复
后台将文件切割存储吧,fastdfs对大文件也不友好的。
或者前端分割上传吧。
tianfang 2020-09-15
  • 打赏
  • 举报
回复
上传大文件,java使用内存而不是磁盘做缓存,如果增加内存容易,(自己的服务器花不了多少多少钱,租用云服务器就可怕了),不妨就高内存跑着 解决方案是:客户端增加js组件 ,分块传送 。 看看你的贴子的推荐文章,都是大文件上传方案
一米阳光zw 2020-09-15
  • 打赏
  • 举报
回复
引用 4 楼 冰思雨 的回复:
楼主自己写代码来接收上传的大文件即可。 如果没有用框架的话,自己写一个Servlet来接收大文件即可。 外面没有可以使用的插件的原因是,web项目极少用来传输大文件,大文件一般都用FTP来传输了。 所以,没有现成的,那就自己写一个。个人觉得,不会太复杂。 1. 找到操作系统指定的临时文件夹,创建临时文件。(要确保临时文件夹有地方存放大文件,多个大文件,系统定期会清理这个文件夹,给硬盘瘦身) 2. 编写处理multipart类型的IO操作的服务端代码(Servlet, Action, Controller等),将发送的文件名,大小,和文件数据保存到临时文件中。 3. 传输完毕后,将临时文件移动到目标文件夹中。 4. 任何失败的情况下,删除临时文件,帮助系统进行瘦身。 另外,断点续传功能相对复杂一点点,不过,只要有耐心,就能搞定,因为技术难度不高,就是稍微复杂一点而已。
哈哈哈,大神说话的样子真的是不一样:我感觉,也不难,我都感觉难到天上去了
引用 12 楼 寒潭映鱼 的回复:
学习了,帮助很大
你这就学习了?我感觉我也没怎么写
寒潭映鱼 2020-09-15
  • 打赏
  • 举报
回复
学习了,帮助很大
一米阳光zw 2020-09-15
  • 打赏
  • 举报
回复
引用 10 楼 一米阳光zw 的回复:
在这里差不多要结贴了,特此总结一下解决方式: 1、mmf,通过memory mapped file 内存映射文件将数据分段存储到mysql或者其他数据库中,不适合,略 2、服务器上ftp,然后通过代码来借助ftp实现 3、lz的解决方式:前端通过vue-upload来实现文件的分片上传功能,后端使用fastdfs自带的分片功能实现数据存储,具体demo可以查看lz个人下载里面的内容
这是一种用磁盘换内存的方式,而且占用极大,需要优化
一米阳光zw 2020-09-15
  • 打赏
  • 举报
回复
在这里差不多要结贴了,特此总结一下解决方式: 1、mmf,通过memory mapped file 内存映射文件将数据分段存储到mysql或者其他数据库中,不适合,略 2、服务器上ftp,然后通过代码来借助ftp实现 3、lz的解决方式:前端通过vue-upload来实现文件的分片上传功能,后端使用fastdfs自带的分片功能实现数据存储,具体demo可以查看lz个人下载里面的内容
一米阳光zw 2020-09-15
  • 打赏
  • 举报
回复
引用 4 楼 冰思雨 的回复:
楼主自己写代码来接收上传的大文件即可。 如果没有用框架的话,自己写一个Servlet来接收大文件即可。 外面没有可以使用的插件的原因是,web项目极少用来传输大文件,大文件一般都用FTP来传输了。 所以,没有现成的,那就自己写一个。个人觉得,不会太复杂。 1. 找到操作系统指定的临时文件夹,创建临时文件。(要确保临时文件夹有地方存放大文件,多个大文件,系统定期会清理这个文件夹,给硬盘瘦身) 2. 编写处理multipart类型的IO操作的服务端代码(Servlet, Action, Controller等),将发送的文件名,大小,和文件数据保存到临时文件中。 3. 传输完毕后,将临时文件移动到目标文件夹中。 4. 任何失败的情况下,删除临时文件,帮助系统进行瘦身。 另外,断点续传功能相对复杂一点点,不过,只要有耐心,就能搞定,因为技术难度不高,就是稍微复杂一点而已。
哈哈哈,大神说话的样子真的是不一样:我感觉,也不难,我都感觉难到天上去了
引用 7 楼 shuangmu9768 的回复:
[quote=引用 6 楼 一米阳光zw 的回复:][quote=引用 2 楼 shuangmu9768 的回复:]后台将文件切割存储吧,fastdfs对大文件也不友好的。 或者前端分割上传吧。
后台切割上传那不是就失去了分片的意义了吗,因为如果后台分的话那数据已经加载在内存中,占用了对应大小的内存[/quote] 后台从流里面读取文件内容,加入规定最大分片10M,则每读取10M存储一下,最终上传完成时记录上传信息,上传失败时回滚。[/quote] 谢谢,不胜感激
hello,world-- 2020-09-15
  • 打赏
  • 举报
回复
分段续传,之前遇到过类似的问题
shuangmu9768 2020-09-15
  • 打赏
  • 举报
回复
引用 6 楼 一米阳光zw 的回复:
[quote=引用 2 楼 shuangmu9768 的回复:]后台将文件切割存储吧,fastdfs对大文件也不友好的。
或者前端分割上传吧。

后台切割上传那不是就失去了分片的意义了吗,因为如果后台分的话那数据已经加载在内存中,占用了对应大小的内存[/quote]
后台从流里面读取文件内容,加入规定最大分片10M,则每读取10M存储一下,最终上传完成时记录上传信息,上传失败时回滚。

81,090

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧