2015-08-13 50 views
0

我想读取一个大小为50Mb的excel,并通过poi在java中包含各种表格,但问题是当我尝试创建对象时,我在下面发布的堆栈跟踪的例外情况。对于出存储器空间错误的我已经配置此用Apache POI打开电子表格时内存不足

-Xmx1024m -Duser.timezone=GMT0 already 
下面

是其中我试图读取的excel拳头,然后将其convrting成字节数组稍后将它作为bytr流,其中i检测它的快照扩展,它是的.xlsx类型的,因此momnet我尝试创造我得到了下面的异常请告知如何从这个

 String fileName = "C:\\abc\\xret.xlsx"; 


FileInputStream fis = new FileInputStream(fileName); 
      ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
       byte[] bFile = new byte[(int) fileName.length()]; 
       byte[] buf = new byte[1024]; 
       try { 
        for (int readNum; (readNum = fis.read(buf)) != -1;) { 
         bos.write(buf, 0, readNum); 
        } 
       } catch (IOException ex) { 
        ex.printStackTrace(); 
       } 
       byte[] bytes = bos.toByteArray(); 
       processExcelObjects(bytes); 

后来下面我正在进一步创建对象如下图所示

克服对象
 byteArrayInputStream = new ByteArrayInputStream(bytes); 

     if (byteArrayInputStream.available() != -1) 
       { 
        if (filename.lastIndexOf("."))).equalsIgnoreCase(".xlsx")) 
         { 

        XSSFWorkbook workbookXlsx = new XSSFWorkbook(); 
         //**** got the exception ********//      
        workbookXlsx = new XSSFWorkbook(byteArrayInputStream); // ****** on this line I got the exception *********// 

       } 

,我在创建上述workbookXlsx对象

    org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException 
      at org.apache.poi.xssf.usermodel.XSSFFactory.createDocumentPart(XSSFFactory.java:62) 
      Caused by: java.lang.OutOfMemoryError: Java heap space 
      at org.apache.xmlbeans.impl.store.Cur$CurLoadContext.attr(Cur.java:3039) 
      at org.apache.xmlbeans.impl.store.Cur$CurLoadContext.attr(Cur.java:3060) 
      Caused by: java.lang.reflect.InvocationTargetException 
      at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
      at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 

请指教是POI内部异常或堆空间一个

+1

可能不是一个答案,但肯定是一个很好的开始[OutOfMemoryError:Java堆空间](http://stackoverflow.com/questions/37335/how-to-deal-with-java-lang-outofmemoryerror-java -heap-space-error-64mb-heap?rq = 1) – Prudhvi

+1

内存不足。 – bmargulies

+0

我正在运行此参数-Xmx1024m -Duser.timezone = GMT0已经 –

回答

1

不是一个POI内部异常有异常,你没用完的记忆。

你可以试着加大对-Xmx2048m以上,但考虑了不同的方法,像在发表的意见建议@sibnick:

Processing large xlsx file in Java

0

该异常意味着你的Java没有足够的内存分配为了运行这个。

可以在命令行上使用java -Xms -Xmx。

如果您运行使用Eclipse的应用程序,

项目上点击右键 - >运行方式 - >运行配置..->选择参数选项卡 - >在VM参数可以增加你的JVM的内存分配

请参阅本文档详细了解vmoptions oracle - vmoptions

0

我认为有一些你应该使用内存分配的问题

for (int readNum; (readNum = fis.read(bFile)) != -1;) { 
         bos.write(bFile, 0, readNum); 
} 

将buf变量替换为bFile变量并检查它。