2017-07-23 48 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()時間(和它的細胞),你就增加了紙張的對象大小(更行,更大的表對象,對吧?)。

我會建議使用塊,所以你可以慢慢地追加數據表,但這可能不會工作,你不得不實例化表,對象仍然很大。

我試着找到另一種解決方案,也許使用更少的內存消耗編程語言爲您的使用情況。