物流IT控: (java POI) WMS大数据BOM导入优化

故事起因:一个WMS系统,需要定期更新从SAP导入BOM表数据Excel文件,数据比较多,共4万多条,2.7M。在服务器直接打开时直接OutOfMemory(内存溢出),急需优化。

Ray: 好啊好啊,让我来分析一下先...

问题分析

起因说了,WMS系统,需要定期更新从SAP系统导入BOM表数据Excel文件,数据比较多,共4万多条,2.7M。服务器是1核1G内存,后台是java,用的POI处理Excel(xlsx),只要用户一选文件导入就OutOfMemory(内存溢出)。

OOM

当时临时解决方案是:用开发员的机器(8G内存)连PROD数据库去导数据,因为内存够大,所以没有爆掉,但是速度非常慢,导一次需要大概十几分钟。

据此判断就是内存问题,理论上加大内存就行啦,但是这个解决方案不是一个适合的方案。虽然解决了OOM问题,速度问题仍旧是个大患。

java问题代码

XSSFWorkbook一次过装载几万条数据到内存中肯定会有问题,应该是按行或分批放进内存处理,这个才是能一劳永逸解决问题的方案。

寻找答案

在Google中寻找java read big excel file oom,非常快的找到了一些靠谱的答案,都指向了需要用到POI的新API。请不要使用百度(不解释)。

点击XSSF进行查看

案例测试

按照官方的例子改造来打开我的BOM excel, 首先我得重现错误,于是把eclipse VM 调整到256M,使用旧代码导入文件。

重现OOM错误

新代码改造, 官方代码地址:https://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/xssf/eventusermodel/XLSX2CSV.java

我改造的地方

改造后再次导入,耗时22秒,虽然时间还是有点稍长,但比起以前十几分钟已足够好,证明方案改造OK了!

结论

我使用了当前(2017-06)POI最新的3.16版本中的XSSF and SAX (Event API),暂不确定这个Event API是否是把Excel逐行放进内存处理的,但已经保证了在低内存(-Xmx256M)的情况下不会发生OOM错误。

学海无涯,在学习的道路上,你并不孤单,希望本文可以帮助到相关的人,我是物流IT人,刘宇,谢谢,再见。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,355评论 25 709
  • 该文章为本系列的第一篇第二篇为 : Java POI操作Excel(Event Model)第三篇为 : Java...
    mmlmml阅读 13,548评论 6 21
  • 该文章为本系列的第二篇第一篇为 : Java POI操作Excel(User Model)第三篇为 : Java ...
    mmlmml阅读 9,535评论 0 5
  • 一 月藏在夜的云里 我躲在一个梦里相思 为你想了许多的祝福 那些擦了又改的话语 二 此刻的你应该入睡了吧 梦里开着...
    蓝桥初雪阅读 374评论 0 0
  • 一扇窗和一个世界(下) 如果说J先生能够为一个小屋新开一扇窗,让其除了日光月光还可以透进别的光,那么Y小姐则创造了...
    9335e0634eb4阅读 311评论 0 1