`

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

    然而,当处理大数据量的Excel文件时,POI可能会导致内存溢出(Out of Memory, OOM),因为默认情况下它会将整个工作簿加载到内存中。为了防止这种问题,我们需要采用优化策略来高效地处理大量数据。 1. **分块读取*...

    关于Poi读取Excel引发内存溢出问题的解决方法

    在处理大量数据时,使用 POI 的默认用户模式(UserModel)读取 Excel 文件可能会导致内存溢出问题,因为该模式会将整个文件加载到内存中。本文将详细介绍如何解决由 POI 用户模式引发的内存溢出问题,并提供相应的...

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

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

    poi解析excel

    【标题】"poi解析excel"涉及的是Java编程中使用Apache POI库来处理Microsoft Excel文件的知识。Apache POI是开源项目,提供了API用于读写Microsoft Office格式的文件,特别是Excel。在Java应用中,POI使得开发者能够...

    poi解析excel的poi包

    以上就是使用Apache POI解析Excel文件并将数据存入Oracle数据库的基本步骤。在实际应用中,你可能需要根据具体需求进行调整,例如处理不同类型的单元格(数字、日期等)、异常处理、优化性能等。

    使用POI解析excel文件并写入数据库

    本篇文章将详细讲解如何使用Apache POI解析Excel文件,并将数据写入数据库。 首先,我们需要了解Apache POI的基本概念。POI提供了一个Java API,使得开发者可以在不依赖Microsoft Office的情况下,处理Excel文件。...

    POI解析excel并存入mysqlのdemo

    这个“POI解析excel并存入mysqlのdemo”是利用 Java 的 Apache POI 库来读取 Excel 数据,并将这些数据存储到 MySQL 数据库中的示例。下面我们将详细探讨相关的知识点。 1. **Apache POI**: Apache POI 是一个...

    解析Excel格式数据的poi的jar包

    使用Apache POI解析Excel数据的基本步骤如下: 1. **添加依赖**:将对应的poi.jar包引入项目类路径。如果是Maven项目,可以在pom.xml文件中添加依赖项,如下: ```xml &lt;groupId&gt;org.apache.poi &lt;artifactId&gt;...

    使用poi解析Excel

    《使用POI解析Excel》 在信息技术领域,处理数据是日常工作中不可或缺的一部分,而Excel作为广泛使用的电子表格软件,其数据处理能力强大且灵活。Apache POI是一个开源库,专门用于读取和写入Microsoft Office格式...

    android poi解析Excel 的三个jar包

    "android poi解析Excel 的三个jar包" 提供了实现这一目标所需的Java库。这些库使得Android应用可以与Excel文件进行交互,而无需依赖Microsoft Office或任何桌面环境。让我们详细探讨这三个关键的jar包以及它们在...

    POI解析Excel,最高支持2010版本的Excel导入数据库

    标题中的“POI解析Excel,最高支持2010版本的Excel导入数据库”是指使用Apache POI库来处理Microsoft Excel文件,并将数据导入到数据库中。Apache POI是一个开源项目,它提供了Java API来读取、写入和修改Microsoft ...

    POI解析excel文件

    2. **解析Excel文件** - **创建工作簿对象**: 使用`WorkbookFactory.create()`方法,传入一个InputStream,可以打开并加载Excel文件。 - **获取工作表**: 通过调用`Workbook`对象的`getSheet()`或`getSheetAt()`...

    poi解析excel相关jar

    标题提到的"poi解析excel相关jar",指的是Apache POI 提供的Java库,用于解析和创建Excel文件。 描述中提到了两个版本的jar文件:"poi-excelant-3.9-20121203" 和 "poi-3.9-20121203"。这两个jar是Apache POI 3.9...

    poi解析excel jar包

    **POI解析Excel的主要知识点** 1. **工作簿(Workbook)**: 在POI中,Excel文件被抽象为一个Workbook对象。你可以创建、读取或修改Workbook。 2. **工作表(Sheet)**: Workbook包含一个或多个Sheet,每个Sheet对应...

    利用poi获取excel数据批量插入大量数据到mysql

    本教程将详述如何使用Apache POI库读取Excel数据,并通过Java的JDBC接口批量插入到MySQL数据库中。Apache POI是Java平台上的一个开源项目,它允许程序员创建、修改和显示Microsoft Office格式的文件,其中包括Excel...

    java利用POI生成与解析EXCEL所需JAR

    在Java中,如果你需要生成或解析Excel文件,POI库是一个非常强大的工具。本篇文章将深入探讨如何使用POI库在Java中创建和读取Excel文档。 首先,我们需要在项目中引入POI相关的JAR文件。在"lib"目录下,你应该能...

    Excel解析工具POI.jar

    《Excel解析工具POI.jar详解》 在信息技术领域,数据处理是不可或缺的一部分,尤其是在大数据时代,Excel作为广泛使用的表格处理软件,其数据处理能力受到广大用户的青睐。然而,当面对大量Excel数据时,传统的手动...

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

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

    POI解析excel所需的包(更全)

    4. **POI 解析Excel** - **读取Excel**:使用`WorkbookFactory.create()`打开已存在的Excel文件,然后通过工作表的迭代器遍历所有行和列,读取单元格的值。 - **导出Excel**:创建新的工作簿,根据数据动态创建行...

Global site tag (gtag.js) - Google Analytics