2017-02-22 9 views
1

Big XLSXファイルを読み込もうとしています。 Excelファイルは500K rows.Iを、それがJavaで巨大なExcelファイル(500K行)を読む

Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space 
at java.util.regex.Matcher.<init>(Matcher.java:225) 
at java.util.regex.Pattern.matcher(Pattern.java:1093) 
at org.apache.poi.xssf.usermodel.XSSFRichTextString.utfDecode(XSSFRichTextString.java:482) 
at org.apache.poi.xssf.usermodel.XSSFRichTextString.getString(XSSFRichTextString.java:297) 
at org.apache.poi.xssf.usermodel.XSSFCell.getStringCellValue(XSSFCell.java:262) 
at Main.get_titles(Main.java:484) 
at Main.analyze_Importsheet(Main.java:461) 
at Main.but_sel_imp_sheetActionPerformed(Main.java:220) 
at Main.access$000(Main.java:40) 
at Main$1.actionPerformed(Main.java:85) 
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) 
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348) 
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
at java.awt.Component.processMouseEvent(Component.java:6533) 
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324) 
at java.awt.Component.processEvent(Component.java:6298) 
at java.awt.Container.processEvent(Container.java:2236) 
at java.awt.Component.dispatchEventImpl(Component.java:4889) 
at java.awt.Container.dispatchEventImpl(Container.java:2294) 
at java.awt.Component.dispatchEvent(Component.java:4711) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888) 
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525) 
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466) 
at java.awt.Container.dispatchEventImpl(Container.java:2280) 
at java.awt.Window.dispatchEventImpl(Window.java:2746) 
at java.awt.Component.dispatchEvent(Component.java:4711) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) 
at java.awt.EventQueue.access$500(EventQueue.java:97) 
at java.awt.EventQueue$3.run(EventQueue.java:709) 
at java.awt.EventQueue$3.run(EventQueue.java:703) 

Main.java:484=ifを以下の例外をスローした後それは行39723 まで印刷さCOL 2.

OPCPackage pkg; 
pkg = OPCPackage.open("File path"); 
XSSFWorkbook myWorkBook = new XSSFWorkbook(pkg); 
Sheet sheet = myWorkBook.getSheetAt(2); 
Iterator<Row> rowIterator = sheet.iterator(); 
while (rowIterator.hasNext()) 
{ 
Row row = rowIterator.next(); 
if (row_num > ROW_ESCAPE) 
{ 
    Cell cell = row.getCell(2); 
    if (!cell.getStringCellValue().toString().trim().isEmpty()) 
      { 
       System.out.println(cell.getStringCellValue().toString()); 
      } 
System.out.println("hi"+row_num); 
     } 
     row_num++; 
} 

を読む必要が周りにあり(!cell.getStringCellValue()。toString()。trim()。isEmpty()) 私はその行を削除し、行番号を印刷するだけで正常に動作します。 col 2の文字列値を取得する方法が必要です。

答えて

0

JVMのヒープサイズを大きくすると、OutOfMemoryErrorが修正される可能性があります。 JVMのヒープサイズを増やす方法については、this stackoverflow postを参照してください。

+0

私は言及しました。私はすでにjava -Xmx1G -jar Importsheet_Breaker.jarを使用しています –

0

ヒープサイズを増やすことが最も簡単な方法です(読み込みロジックを変更せずに)。

これが実行可能なオプションでない場合は、ストリームを使用してください。 実際には、すでに利用可能な便利なライブラリがあります。

https://github.com/monitorjbl/excel-streaming-reader

+0

私のExcelシートには隠れたシートがいくつかあります。ストリームで私はこれらのシートを読むことができません。 XSSFWorkbook oldWorkbook; OPCPパッケージ。 pkg = OPCPackage.open(myImport.get_path()); oldWorkbook =(XSSFWorkbook)WorkbookFactory.create(pkg); 昨日、ボブのコードが動作していましたが、驚くべきことに今日は動作が停止し、heapsizeエラーが発生しました。 –

関連する問題