2017-07-23 43 views
0

我必须做一个简单的程序来分析大型文本文件并将它们转换为excel文件。我的代码是功能性的,但我的程序的内存使用情况有问题。在Java中重复包含循环n次的函数

想象一个包含一些消息的文件,其中1行等于1消息。我的程序基本上将信息分割成几部分。 例如:

比方说,我的消息是这样的: {{1:FOO} {2:BAR} {3:一些文字} ... {N:最后INFO}}

一旦我读完这一行,我将下列信息(“FOO”,“BAR”,“更多文本”,...,“最后的信息”)放入列表中,然后我调用我的函数insertLineIntoExcelSheet(List infos)将数据插入到我的excel文件中的一行中。

我已经调试我的程序,我已经想通了,内存问题来自 以下功能:

public void insertLineIntoExcelSheet(List<String> line){ 
    Row row = sheet.createRow(nbRows++); 
    int colNum = 0; 
    for (String field : line) { 
    Cell cell = row.createCell(colNum++); 
    cell.setCellValue((String) field); 
    } 
} 

的问题是,当我有信息量大(N例如)在我的文本文件中,前一个函数被调用n次,结果是JVM需要大量内存(〜1GB的RAM)(当我在我的代码中注释这个函数时,jvm只需要〜150MB的RAM) 。 那么,有没有办法来优化这个功能?

P.S:我正在使用Apache POI来创建我的excel文件并向其中添加行/单元格。

在此先感谢

+0

'insertLineIntoExcelSheet'中消耗的唯一内存似乎是由不断增长的Excel工作表占用的。没有得到解决。但是,该方法的调用者对所有传入的列表进行了哪些操作?它是否永远保持着它们? –

+2

请阅读https://poi.apache.org/spreadsheet/how-to.html#sxssf –

+0

@KevinAnderson调用方法只是创建列表,然后调用参数中的列表的insertLineIntoExcelSheet方法。列表不存储如果这就是你想知道 –

回答

0

从逻辑上讲,每次发出sheet.createRow()时间(和它的细胞),你就增加了纸张的对象大小(更行,更大的表对象,对吧?)。

我会建议使用块,所以你可以慢慢地追加数据表,但这可能不会工作,你不得不实例化表,对象仍然很大。

我试着找到另一种解决方案,也许使用更少的内存消耗编程语言为您的使用情况。