2011-12-07 120 views
0

我有一个写入excel文件的程序。 它使用Apache POI来编写excel 2007文件(我有超过256个colums,所以我必须使用它)。该计划的作品。我已经在非常小的文件上进行了测试,但如果我使用更多的行,则会导致内存不足。尝试使用Apache POI编写Excel文件导致OutOfMemoryError

这里的堆栈跟踪:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
    at java.util.Arrays.copyOf(Unknown Source) 
    at java.io.ByteArrayOutputStream.write(Unknown Source) 
    at org.apache.poi.openxml4j.opc.internal.MemoryPackagePartOutputStream.write(MemoryPackagePartOutputStream.java:88) 
    at org.apache.xmlbeans.impl.store.Cursor._save(Cursor.java:590) 
    at org.apache.xmlbeans.impl.store.Cursor.save(Cursor.java:2544) 
    at org.apache.xmlbeans.impl.values.XmlObjectBase.save(XmlObjectBase.java:212) 
    at org.apache.poi.xssf.usermodel.XSSFSheet.write(XSSFSheet.java:2480) 
    at org.apache.poi.xssf.usermodel.XSSFSheet.commit(XSSFSheet.java:2439) 
    at org.apache.poi.POIXMLDocumentPart.onSave(POIXMLDocumentPart.java:196) 
    at org.apache.poi.POIXMLDocumentPart.onSave(POIXMLDocumentPart.java:200) 
    at org.apache.poi.POIXMLDocument.write(POIXMLDocument.java:204) 
    at model.Conversione.traduzioneFile(Conversione.java:219) 
    at model.Main.scriviFile(Main.java:75) 
    at model.Main.main(Main.java:51) 

会出现错误(根据堆栈跟踪)在哪里写入“workbook.write(FILEOUT)”的行,其中FILEOUT是一个FileOutputStream。这意味着所有java对象都有足够的内存来存储excel文件,但由于某些原因,在写入硬盘时,它必须占用更多的内存。

只是告诉你,我试图增加java堆大小,直到1演出(通过添加-Xms128m -Xmx1024m),但仍然似乎没有做tric。

帮助! OO


实施例编:

..

import org.apache.poi.ss.usermodel.Row; 
import org.apache.poi.ss.usermodel.Sheet; 
import org.apache.poi.ss.usermodel.Workbook; 
import org.apache.poi.xssf.usermodel.XSSFWorkbook; 

//I'M USING A DATABASE 
import DAO.EventoDAO; 
import DAO.ParametroDAO; 

public class Conversion { 

public static void traduzioneFile(File read, File write){ 
    FileOutputStream fos=null; 


    try { 
     fos = new FileOutputStream(write); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
    if (fos!=null) { 

     try{ 

      Workbook wb = new XSSFWorkbook() ; 

      Sheet sheet = wb.createSheet(); 

      //I'm reading from a table in a .txt file , converting values, and putting them in a table.. 

      FileInputStream fis; 
      try { 
       fis = new FileInputStream(fileLettura); 
       InputStreamReader isr=new InputStreamReader(fis); 
       BufferedReader br=new BufferedReader(isr); 
       String line=br.readLine(); 

       //here there are some variables 
       while(line!=null) { 

        Row row = null; 
        row=sheet.createRow((short)row_number); 


              //arrayLinea contains all the words of the line 
        while (column_number<arrayLinea.length){ 
        value=arrayLinea[column_number]; 
//if value is ok i translate it and put it in a cell 
         row.createCell((short)contatoreColonne).setCellValue(value); 
            contatoreColonne++         

         } 
         //next line 
         linea=br.readLine(); 
         row_line++; 

       } 



     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     }catch (Exception ex){ 
      ex.printStackTrace(); 

     } 


     wb.write(fos); 
     fos.flush(); 
     fos.close(); 

    }catch (FileNotFoundException e){ 
    }catch (IOException e){ 
    }catch (Exception e){ 

    } 

} 
} 

我希望是可读..然而即时扫描每一行,翻译的值每列的列,将它们在细胞中...那部分没问题..我用systems.out.println ^^ 对它进行了测试,但在最后一行说“翻译完成,开始写入”后,发生错误。

+0

向我们显示导致此问题的代码。 – Woot4Moo

+0

好..我编辑的帖子显示比真实的代码更简单的代码,因为它是一个相当复杂的工作的一部分:D .. –

+0

您是否尝试在任务管理器中检查jvm的内存使用情况?您是否尝试设置newGC(请参阅java.sun.com/docs/hotspot/gc1.4.2/faq.html或acevedoalberto.wordpress.com/2009/01/16/jvmtuning)?您也可以尝试使用MAT来检查现有的内存泄漏堆,它可以帮助您非常多 – gaffcz

回答

0

您应该pu t调试中断点并跟踪您的代码。

某处我认为是无限循环,永远不会结束并导致OOM错误。

+0

不..编码部分没问题..我已经测试过好几次了......但是如果文件包含的行数超过特定数量(我会在一分钟内告诉你的数字,当我看到它时:D )例外进来wb.write(fos)... –

+0

与10000行是好的....与18000没有 - –

+0

那么列大小呢? –

9

使用POI编写.xlsx文件会占用大量内存。 1演出可能是不够的。

最近Apache POI推出了一个新的API(SXSSF),这是一个用于编写.xlsx文件的流式实现。还没有使用它,但也许这是你可以研究的东西。

+0

+1大文件在POI中使用大量内存 – oers

+1

我刚试过 - 用SXSSFWorkbook()切换出XSSFWorkbook(),一切正常完全马上,非常,非常快。谢谢! –

0

尝试增加堆空间。

如果您使用的是Eclipse,那么右键单击您的项目文件夹,选择Run as-> Run Configuration-> Arguments选项卡。

在参数选项卡,尝试设置这些参数,

-Xms以设置初始Java堆大小

-Xmx设置最大Java堆大小

-Xss设置Java线程堆栈大小

实施例:

-Xms1024m -Xmx1524M

然后运行该程序。

我希望这应该工作。

对不起,对于如此延迟的回复:D

相关问题