问题复现
工作中,项目里的导入功能采用了poi读取然后进行业务操作,在导入50M文件时发生了OOM报错信息,以下是本地复现的错误信息(由于环境不一样,本地导入14M的文件就已出现错误)
究其原因
项目中使用WorkBook这个类处理文件,这会先把文件中cell读到内存当中,当数据量比较大的时候就会产生java.lang.OutOfMemoryError: Java heap space错误。
看一下导入过程中内存的消耗情况
可以看出,导入过程内存消耗越来越大,直至抛出异常
easyExcel解决
核心原理
easyExcel是阿里的一个开源项目,可以解决内存消耗大的问题,主要因为解决了3个问题:
1.文件解压和读取的方式是通过文件的形式,不再是poi的内存形式
2.使用sax模式一行一行的读取,不将数据全部加载到内存中
3.抛弃了不重要的数据,比如字体宽度大小等格式。
性能测试
以上都是官网上的说法,不能只听他吹,实际测试一下到底读取大文件时会不会内存溢出,为了简单,只是读取数据,并没有业务逻辑
代码准备
@RestController
@RequestMapping("easyExcel")
public class TempEasyExcelController {
private static final Logger logger = LoggerFactory.getLogger(EasyExcelController.class);
@Autowired
private TempEasyExcelService easyExcelService;
@PostMapping("impExcel")
public String importExcel(MultipartFile file) {
long start = System.currentTimeMillis();
try {
easyExcelService.importExcel(file.getInputStream());
logger.info("文件大小:{}