OutOfMemoryError:要上载8 MB大小文件的Java堆空间

时间:2015-06-26 09:08:26

标签: grails groovy out-of-memory apache-poi

我正在使用Grails 2.4.4并尝试使用' apache poi'上传.xlsx文件。插件,但当文件大小约为8 MB时,我得到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)
      }
   }
}

我也尝试过使用grails-excel-import插件,但是我得到了同样的例外。

有人可以建议如何在grails中导入大尺寸的Excel文件。提前谢谢。

2 个答案:

答案 0 :(得分:0)

Poi的内存占用率很高。请参阅: http://poi.apache.org/spreadsheet/index.html

您可以尝试使用SXSSF。 SXSSF是XSSF的API兼容流式扩展,用于必须生成非常大的电子表格,并且堆空间有限。

答案 1 :(得分:0)

这个'XSSF API'的问题在于,当我为excel表创建了根对象(工作簿)时,堆空间在生成对象时已满,并且缺少用于构建工作簿对象的堆空间。因此,在增加堆大小后处理工作表的可能性较小,因为excel工作表可能要大得多。

    <?php
//Start session
session_start();
//Check whether the session variable SESS_MEMBER_ID is present or not
if (!isset($_SESSION['id']) || ($_SESSION['id'] =='')) {
    header("location: index.php");
    exit();
}
$session_id=$_SESSION['id'];
$user_query = $conn->query("select * from members where member_id = '$session_id'");
$user_row = $user_query->fetch();
$name = $user_row['firstname']." ".$user_row['middlename']." ".$user_row['lastname'];
?>

因此,在一些R&amp; D之后,我发现了另外一个API来处理大型excel表,即“XSSF和SAX(事件API)”。但为此,您可以获取基础XML数据,并自行处理。

您可以在此处找到完整的文档 - https://poi.apache.org/spreadsheet/how-to.html

由于