项目上需要导入一个几百万数据 excel 文件到数据库中,有哪些注意点?

Sherwin.Wei Lv7

项目上需要导入一个几百万数据 excel 文件到数据库中,有哪些注意点?

回答重点

对于百万数据的导入,一般需要关注三类问题:

1)内存,如果一次性在堆内加载过多的数据,可能会导致内存溢出。
2)时间,百万数据插入数据库需要一定的时间,同步调用可能会使得方法超时。
3)异常,百万数据中可能会有很多异常的情况,比如格式错误、重复数据等等。

内存是有限的,不能一次性将 excel 内的所有数据都加载到内存中,需要分批加载

像 apache poi 会将整个文件加载到内存中,内存占用较高,而 easyexcel 则是基于 sax 解析,逐行读取数据,避免将整个文件加载到内存中,因此我们采用 easyexcel 框架读取文件,避免内存溢出。

excel 单 sheet 存储的文件是有上限的,需要保证 100w 条以内,因此如果是几百万的数据,单文件肯定是多 sheet。

我们可以针对 sheet 数量起对应的线程进行多线程读取,这样可以加快读取的速度,并且不要读取一条数据就调用数据库进行保存,我们可以需要批量保存,比如加载 500 条数据到内存中,存在 list 内,然后调用数据库批量保存接口,一次性保存这些数据,这样会大大提升插入的速度。

最后异常的处理,一般业务上会跳过异常的数据,继续日志记录,等文件导入完毕后,再单独处理这些数据。

扩展知识

EasyExcel

根据官网描述:

Java 解析、生成 Excel 比较有名的框架有 Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi 有一套 SAX 模式的 API 可以一定程度的解决一些内存溢出的问题,但 poi 还是有一些缺陷,比如 07 版Excel 解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。
easyexcel 重写了 poi 对 07 版 Excel 的解析,一个 3M 的 excel 用 POI sax 解析依然需要100M左右内存,改用 easyexcel 可以降低到几 M,并且再大的 excel 也不会出现内存溢出;03 版依赖 POI 的 sax 模式,在上层做了模型转换的封装,让使用者更加简单方便。

SAX(Simple API for XML)

EasyExcel 使用基于 SAX(Simple API for XML)的解析方式来读取 Excel 文件,这意味着它是逐行读取数据的。

SAX 是一种事件驱动的解析方法,每读取一行数据就触发一个事件,而不是像 POI 那样将整个文件加载到内存中。这使得 EasyExcel 在处理大文件时非常高效,内存消耗非常低,能够处理几百万行的数据而不会导致内存溢出。

不过 EasyExcel 已经进入了维护模式了:
image.png

但据 EasyExcel 所说,他即将推出 EasyExcel-plus 版本(目前还未正式发布)

image.png
Comments
On this page
项目上需要导入一个几百万数据 excel 文件到数据库中,有哪些注意点?