Grails OutOfMemoryError:用于上载8MB大小文件的Java堆空间
我正在使用Grails2.4.4,并试图使用“ApachePOI”插件上载一个.xlsx文件,但当文件大小约为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
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
?这些文件都是假的!