2010-01-29 82 views
4

我正在使用最新的POI 3.5讀取Excel。我安裝了Excel MS Office 2007,並且爲此poi提供了用於執行數據的XSSF。Excel POI 3.5 WorkBook Java堆空間異常?

對於15000行數據,它正在正確執行,但是當超出限制直到30000或100000或200000時,它很容易出現Java堆空間異常。

代碼如下:

UATinput = new FileInputStream(UATFilePath); 

uatBufferedInputStream = new BufferedInputStream(UATinput); 

UATworkbook = new XSSFWorkbook(uatBufferedInputStream); 

我正在爲Java堆大小的最後一行例外。 我已經使用-Xms256m -Xmx1536m增加了大小,但仍然爲更多的數據提供Java堆空間異常。

任何人都可以幫我解決這個XSSFWorbook異常嗎?

+0

您無法將最大堆大小(-Xmx)設置爲小於起始堆大小(-Xms) - 您是否犯了拼寫錯誤? – 2010-01-29 03:08:56

回答

6

不必讀取內存中的整個文件嘗試使用eventusermodel API

這是閱讀一個非常有效的記憶方法大文件。它的工作原理是SAX解析器(與DOM相反),因爲它會在遇到特定數據結構時調用回調方法。因爲它希望你知道底層數據

Here的基本事實,你可以找到關於此主題

希望這有助於一個很好的教程,它可能會有點棘手!

0

試試這個:-Xms256m -Xmx512m

0

如果您使用XSSFWorkbook,POI必須創建一個包含整個Excel文件的內存模型,因此會佔用大量內存。也許你可以使用Event API,它不像用戶API那麼簡單,但可以降低內存消耗。

通過你也可以設置-Xmx更大價值的方式...

0

在你自己的代碼中要注意的另一件事是你有多少個「新」對象。如果在通過單元格讀取時創建大量對象,則可能會耗盡堆。確保你正在小心你創建的對象的數量。

1

其真正的傢伙,使用UserEventModel後,我的表現非常棒。如果你們有任何問題,請寫信給我。 [email protected]

0

正如其他人所說,最好的辦法是進行切換的的Event API

一兩件事,會讓小的差異,雖然是不換你的文件輸入流! XSSF會高興地接受一個File作爲輸入,這比InputStream的內存佔用更少。這是因爲POI需要對內容進行隨機訪問,並且對於輸入流來說,唯一的方法就是將整個內容緩衝到內存中。通過一個文件,它可以尋找周圍。使用文件而不是InputStream將節省您的文件大小的內存價值。

如果可以,您應該傳遞一個文件。如果內存緊張,請將您的InputStream寫入一個文件並使用它!

0

JVM以固定的可用內存運行。一旦這個內存超過,你會收到「java.lang.OutOfMemoryError」。 JVM嘗試在啓動時對可用內存做出明智的選擇(請參閱Java設置以瞭解詳細信息),但可以使用以下設置覆蓋缺省值。

要轉換性能,您可以在JVM中使用某些參數。 Xms1024m - 將JVM的最小可用內存設置爲1024兆字節 Xmx1800m - 將JVM的最大可用內存設置爲1800兆字節。 Java應用程序無法使用通過此參數定義的更多堆內存。

如果從命令行啓動Java程序,請使用以下設置:java -Xmx1024m YourProgram。

0

您可以使用SXSSF,構建於XSSF之上的低內存腳本SXSSF API。 「http://poi.apache.org/spreadsheet/how-to.html#sxssf

+0

SXSSF是隻寫的:SXSSF是XSSF的API兼容流式擴展,用於製作非常大的電子表格時,並且堆空間有限。 – 2014-04-16 08:05:04

相關問題