两年前做本地做的工具测试,贴子一直发布在内网今天贴到里面CSDN里面来。
当时选择了两个 excel处理工具,XLSReader 和 StreamingReader ,当时没有使用阿里的easy-excel (当时不知道这个框架,羞愧... )
主要列出了两种工具和JVM的使用情况,因为大部分excel解析工作都以 内存溢出告终,希望文章对大家有所帮助;
背景,需求导入大量 excel文件,百万级;
文件名 | 大小 | 记录数 | 列名 |
2019-2020充值.xlsx | 27M | 469869 | 创建时间(yyyy/mm/dd hh:mm:ss),订单号(acquire_order_no),协议号(agreement_no),memberId,金额,状态 |
2019-2020交易.xlsx | 15M | 161981 | 创建时间(yyyy/mm/dd hh:mm:ss),订单号(acquire_order_no),协议号(agreement_no),memberId,金额,状态,(订单内容)body,appName,商户,商户订单号,类型 |
2019-2020余额.xlsx | 74M | 796258 | memberId,金额,状态,(订单内容)body,appName,商户号,商户订单号,类型,支付金额 |
20201021-表3(1-6).xlsb | 296M | 1000001*6 (6百万) | 订单号,memberId,金额,创建时间 |
XLSReader :
27M 和 15M 的文件解析正常的,所以没有关注JVM情况
使用 XLSReader 解析 2019-2020余额.xlsx时 系统无法支撑
1 jvm配置 -Xmx8000m -XX:NewRatio=3 ;old Gen 19次后,基本奔溃,如图:
2 jvm配置 -Xmx8000m -XX:NewRatio=2 old Gen 10 次收,基本奔溃
故判断和 Eden区的大小也无关
StreamingReader 解析
解析 2019-2020余额.xlsx,顺利完成解析
1 jvm配置 -Xmx8000m -XX:NewRatio=2
2 jvm配置 -Xmx8000m -XX:NewRatio=3
继续大文件 20201021-表3(1-6).xlsb,顺利解析完成,下面罗列下几种情况下不同效果
1 jvm配置 -Xmx8000m -XX:NewRatio=3
2 增加 Xms 减少 old Gen次数,-Xmx8000m -Xms5000m -XX:NewRatio=3
3 jvm配置 -Xmx8000m -XX:NewRatio=2,
old Gen 次数增多,但是程序还是持续执行完成了,原因在于增加了 young gen 的比例导致 old gen 空间下降
另附JVM 和 收集器命令,
1 堆设置
-Xms :初始堆大小
-Xmx :最大堆大小
-XX:NewSize=n :设置年轻代大小
-XX:NewRatio=n: 设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
-XX:SurvivorRatio=n :年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
-XX:MaxPermSize=n :设置持久代大小
2 收集器设置
-XX:+UseSerialGC :设置串行收集器
-XX:+UseParallelGC :设置并行收集器
-XX:+UseParalledlOldGC :设置并行年老代收集器
-XX:+UseConcMarkSweepGC :设置并发收集器