先说问题
偶遇项目数据文件为.csv格式存储,单个数据文件过大,导致程序在读取CSV文件内容时候jvm内存爆表。
单个文件当时为6G多,通过测试发现,预估数据行约 三百万 数据,文件差不多为90多M。
过大的单个文件电脑也是无法打开的。需要进行拆分目标是拆分到100M以内。
需求与思路
- 文件需要进行页面下载,过大的文件下载有问题,就算下载下来也不可读。
- 程序读取一个大的文件也是会出现各种内存问题。
- 按照理想将大文件拆分成独立的N个小文件,每个小文件控制在100M以内。
前端对于大文件不展示下载按钮,展示一个拆分按钮,下载前需要进行大文件的拆分,当然前端用户也可以指定单个文件希望拆分完的大小。
用户点击拆分按钮后,后台通过异步线程池去做这个事,对于大文件的操作比较耗时,不能一直阻塞,需要通过异步去做这个事,收到请求响应拆分中,可同时在redis中防止一直标识表示该文件在异步拆分中,前端web页面按钮disable不可再次点击展示为 拆分中 ... ,拆分成功后清楚对应标识,下载按钮重新展示,点击后弹出拆分完的文件列表,可进行单个文件下载。
拆分逻辑实现
抓重点说拆分, 累了抽空补充