Grails OutOfMemoryError:用于上载8MB大小文件的Java堆空间

Grails OutOfMemoryError:用于上载8MB大小文件的Java堆空间,grails,groovy,out-of-memory,apache-poi,Grails,Groovy,Out Of Memory,Apache Poi,我正在使用Grails2.4.4,并试图使用“ApachePOI”插件上载一个.xlsx文件,但当文件大小约为8MB时,我遇到了JAVA堆大小异常 我的控制器具有以下操作和方法:- def uploadForm() { String fileName = "D:\\File.xlsx" Map excelSheetMap = process(fileName) } Map process(String fileName) { ExcelBuil

我正在使用Grails2.4.4,并试图使用“ApachePOI”插件上载一个.xlsx文件,但当文件大小约为8MB时,我遇到了JAVA堆大小异常

我的控制器具有以下操作和方法:-

def uploadForm() {       
       String fileName = "D:\\File.xlsx"
       Map excelSheetMap = process(fileName)
}

Map process(String fileName) {
    ExcelBuilder excelBuilder = new ExcelBuilder(fileName)  
    //Getting JAVA Heap Size exception here when I am trying to create an object 
    //of ExcelBuilder with the file      
}
ExcelBuilder.groovy类文件如下所示

class ExcelBuilder {
   Workbook workbook
   ExcelBuilder(String fileName) {      
      new File(fileName).withInputStream { is ->
         workbook = new XSSFWorkbook(is)
      }
   }
}
我也尝试过使用GrailsExcel导入插件,但我得到了同样的异常


有人能建议如何在grails中导入大尺寸excel文件吗。提前感谢。

Poi确实占用了大量内存。请参阅:


你可以试试SXSSF。SXSSF是XSSF的一个与API兼容的流式扩展,在必须生成非常大的电子表格且堆空间有限时使用。

此“XSSF API”的问题是,当我为excel表格创建根对象(工作簿)时,生成对象时堆空间已满,并且缺少用于生成工作簿对象的堆空间。因此,在增加堆大小后处理工作表的可能性较小,因为excel工作表可能更大

new File(fileName).withInputStream { is ->
         workbook = new XSSFWorkbook(is)
         //Getting JAVA Heap Size exception here when I am trying to create  an object 
      }
因此,经过一些研发,我又找到了一个处理大型excel表的API,即“XSSF和SAX(事件API)”。但为此,您可以获取底层XML数据,并自己处理它

您可以在此处找到完整的文档-


谢谢

您是否尝试增加应用程序内存?例如,
run:[maxMemory:1280,minMemory:128,debug:false,maxPerm:256,forkReserve:true,jvmArgs:jvmArgs]
,它会工作吗?您是否尝试过使用
jmc
jvisualvm
来查看内存的去向?如果您使用
-XX:+heapdumponautofmemoryerror
运行jvm,您可以在事后分析堆转储。当您有
文件时,为什么要使用
InputStream
?这些文件都是假的!