`

poi解析excel内存溢出

 
阅读更多

  

  真是悲剧啊,一个破内部使用系统20多个人使用的后台管理系统有个excel文件上传功能,使用poi3.6版本来解析excel,出现的case是20多个人同时在上传,平均每个人上传的excel有1000多行,大小也就是不到100k吧,由于每个excel后端处理服务时间较长,导致同时需要处理100k*20的excel的行数,本来也就几M的数据量,可是poi解析居然要用掉的内存是这个量的几百倍,不可思议,

使用代码如下:

   

   XSSFWorkbook wb = new XSSFWorkbook(inputStream);
            XSSFSheet sheet = wb.getSheetAt(0);
            Iterator<Row> iter = sheet.iterator();
            boolean isfirstline = true;
            while (iter.hasNext()) {
                Row row = iter.next();
                if (isfirstline) { // 忽略上传文件第一行的标题栏
                    isfirstline = false;
                    continue;
                }
                 //解析excel,每行有11列,然后对每列解析出来之后调用后端服务把数据保存到数据库中,
                }
            }

 

 内存当时监控,重启一次马上又挂了,

  

 

 

在本地测试了下:

  用4.5M多的14多w条记录的excel上传后,然后调试dump jvm  heap信息,可怕的poi解析过程使用的两个类的内存占用量惊人的大

  

 

 

网上查了下,大概有几种解决方法:

1. 这个不知道哪个版本才有,3.6是没有的

官方DEMO中有个

    Workbook wb = new SXSSFWorkbook(1000);
        // keep 1000 rows in memory,
        // exceeding rows will be
        // flushed to disk

内存里一次只留 多少行

   

2.尽量使用csv或者txt格式的文件;

3.如果确实必须使用excel,以前有人在传统软件里面是用.net的com组件去调用office的API,这种性能应该是最优的,然后在.net里面提供服务异步解析excel文件;

4.最好能把用户上传的excel先保存起来,然后用一个异步线程一个一个处理excel,这样就不会同时处理好几个excel的量导致内存暴涨,然后excel最好分批上传;

  • 大小: 36.6 KB
  • 大小: 118.1 KB
4
1
分享到:
评论
7 楼 zhwj184 2013-03-22  
是的,sax解析不会出现oom,上面那个图是dragoon
6 楼 wf_wangfeng 2013-03-21  
这个监控工具怎么调出来的呢?
5 楼 shadowlin 2013-03-21  
cyeboss 写道
XSSFWorkbook默认用dom解析的,可以换用sax解析.一次性读取十五条记录不会oom

用sax解析比较省内存,缺点就是没法建立完整的dom树。。不过excel的话应该不是啥问题吧。
4 楼 liuhui8278 2013-03-21  
dragoon监控?
3 楼 cyeboss 2013-03-21  
XSSFWorkbook默认用dom解析的,可以换用sax解析.一次性读取十五条记录不会oom
2 楼 zhwj184 2013-03-21  

第一个图用的是公司的监控系统,直接jvm查询内存使用率统计信息
下面那个图是:
jconsole + mat jmap
1 楼 ilovecoding 2013-03-21  
哥们用的什么内存监控工具?

相关推荐

    java poi 导入大数据量Excel数据 防止内存溢出处理.zip

    java 使用 poi 解析导入大数据量(几万数据量+)时,报出OOM。这是使用POI 第二种处理方法,解决大数据量导入内存溢出问题,并提升效率

    大数据Excel操作不会内存溢出POI

    绝对原创,这是我在项目中解决大数据Excel导入时内存溢出问题而编写的Excel行级解析器。同时支持Excel-2003和Excel-2007,excel-2003解析采用poi的eventusermodel模式实现,2007采用xmlreader实现,经项目验证,...

    poi:适合解析小的excel文件,文件稍微大一点就出现OOM。

    事件驱动解析是把文件转换成xml,然后一边读取一边解析,这样就对内存的占用就会很少,可以很好的处理poi出现OOM的问题。 maven添加需要的jar包 &lt;groupId&gt;org.apache.poi &lt;artifactId&gt;poi &lt;version&gt;3.15 ...

    通用Excel导入设计方案的实现源码不会内存溢出

    根据这个设计方案,做了详细的实现,经项目验证,Excel文件20W条数据不成问题,因为Excel解析是我自己原创的行级处理器,不会一次性生成很多对象,因此不存在内存溢出现象,只要excel文件放得下,有多少记录都没问题...

    解析excel到实体类,解决内存溢出

    把公司用的封装了一下,用于解析excel文件到实体,使用注解,数据大的使用sax防止溢出 https://github.com/hellojamie/ebatis

    JAVA 解析 Excel 工具 Java 解析、生成 Excel 比较有名的框架.rar

    JAVA解析Excel工具EasyExcel Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存&#xff0c;poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题&#xff0c;但...

    快速、简洁、解决大文件内存溢出的java处理Excel工具

    easyexcel重写了poi对07版Excel的解析,一个3M的excel用POI sax解析依然需要100M左右内存,改用easyexcel可以降低到几M,并且再大的excel也不会出现内存溢出;03版依赖POI的sax模式,在上层做了模型转换的封装,让...

    java大数据Excel行级解析源码不会内存溢出

    因为是用eventusermodel驱动实现的,不会出现内存溢出问题,经项目验证,excel文件20W行数据没有丝毫问题。 由于网络上没有可用资料,解决这个问题花费时间较多,因此分比较高,但物有所值,一定不会让您失望。

    POI读写海量Excel(详细解读)

    对于写入较低版本的Excel2003,POI使用了用户模式来处理,就是将整个文档加载进内存,如果数据量大的话就会出现内存溢出的问题,Excel2003Writer就是使用这种方式。据笔者的测试,如果数据量大于3万条,每条8列的话...

    EasyExcel JAVA解析Excel工具 v3.3.4

    easyexcel重写了poi对07版Excel的解析,一个3M的excel用POI sax解析依然需要100M左右内存,改用easyexcel可以降低到几M,并且再大的excel也不会出现内存溢出;03版依赖POI的sax模式,在上层做了模型转换的封装,让...

    Java poi基于事件驱动读取excel 2007海量数据 处理空单元格

    该工具类是poi基于事件驱动去读取海量excel数据,解决内存溢出以及空单元格的问题。 该压缩包里面有两个文件,TestExcel.java主要是原始的处理方法,操作简单,适合小数据量的读取。 ExampleEventUserModelUtil.java...

    EasyExcel JAVA解析Excel工具.rar

    Java解析、生成Excel比较有名的框架有Apache poi、jxl,但他们都存在一个严重的问题就是非常的耗内存。 EasyExcel 重写了poi,使一个3M的excel只需要几M内存,并且再大的excel不会出现内存溢出。 64M内存1分钟内...

    EasyExcel是一个快速、简洁、解决大文件内存溢出的java处理Excel工具 .rar

    EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。 EasyExcel简单的写入与读取 进入正题如何使用esayexcel写入和解析excel表格...

    快速、简洁、解决大文件内存溢出的java处理Excel工具 .rar

    几番定位查找发现是在读取excel的时候导致此问题的发生,因此在通常使用的为POI的普通读取,在遇到大数据量excel,50mb大小或数十万行的级别的数据容易导致读取时内存溢出或者cpu飙升。需要注意,本文讨论的是针对...

    Chat2DB 智能数据库客户端,数据报表工具,自然语言生成SQL,生成报表

    JAVA解析Excel工具;Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如...

    EasyExcel(生成Excel报表)基本操作.pdf

    easyexcel重写了poi对07版Excel的解析,能够原本一个3M的excel用POI sax依然需要100M左右内存降低到几M,并且再大的excel不会出现内存溢出,03版依赖POI的sax模式。在上层做了模型转换的封装,让使用者更加简单方便

    阿里EasyExcel的操作.pdf

    easyexcel重写了poi对07版Excel的解析,能够原本一个3M的excel用POI sax依然需要100M左右内存降低到几M,并且再大的excel不会出现内存溢出,03版依赖POI的sax模式。在上层做了模型转换的封装,让使用者更加简单方便

    easyexcel-1.1.2-beta5.jar

    easyexcel重写了poi对07版Excel的解析,能够原本一个3M的excel用POI sax依然需要100M左右内存降低到KB级别,并且再大的excel不会出现内存溢出,03版依赖POI的sax模式。在上层做了模型转换的封装,让使用者更加简单...

Global site tag (gtag.js) - Google Analytics