Sobrecarga de memória usando POI para ler arquivo ms excel

Boa tarde pessoal, :smiley:

Estou usando o POI 3.7 para ler um arquivo .xlsx de 24MB. este arquivo possui 23 folders e cada um possui uma média de 500 linhas e 3 colunas cada. Só o primeiro folder tem mais de 140.000 registros(linhas).

O problema é que quando instancio o WorkBook ele carrega o arquivo inteiro na memória e não somente o folder (sheet) que necessito.

O meu programa precisa ler um folder de cada vez e importar as informações para o MySql. Durante este processo ocorre o erro abaixo:

[code]Exception occurred during event dispatching:
java.lang.OutOfMemoryError: Java heap space
at java.awt.image.DataBufferInt.(DataBufferInt.java:41)
at java.awt.image.Raster.createPackedRaster(Raster.java:458)
at java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:1015)
at sun.awt.image.SunVolatileImage.getBackupImage(SunVolatileImage.java:225)
at sun.awt.image.VolatileSurfaceManager.getBackupSurface(VolatileSurfaceManager.java:252)
at sun.awt.image.VolatileSurfaceManager.initialize(VolatileSurfaceManager.java:108)
at sun.awt.image.SunVolatileImage.(SunVolatileImage.java:72)
at sun.awt.image.SunVolatileImage.(SunVolatileImage.java:101) at sun.awt.image.SunVolatileImage.(SunVolatileImage.java:101)

at java.awt.GraphicsConfiguration.createCompatibleVolatileImage(GraphicsConfiguration.java:284)
at java.awt.GraphicsConfiguration.createCompatibleVolatileImage(GraphicsConfiguration.java:218)
at com.sun.java.swing.plaf.nimbus.AbstractRegionPainter.getImage(AbstractRegionPainter.java:663)
at com.sun.java.swing.plaf.nimbus.AbstractRegionPainter.paintWithFixedSizeCaching(AbstractRegionPainter.java:626)
at com.sun.java.swing.plaf.nimbus.AbstractRegionPainter.paint(AbstractRegionPainter.java:139)
at com.sun.java.swing.plaf.nimbus.AbstractRegionPainter.paint(AbstractRegionPainter.java:25)
at com.sun.java.swing.plaf.nimbus.SynthPainterImpl.paint(SynthPainterImpl.java:47)
at com.sun.java.swing.plaf.nimbus.SynthPainterImpl.paintBackground(SynthPainterImpl.java:87)
at com.sun.java.swing.plaf.nimbus.SynthPainterImpl.paintBackground(SynthPainterImpl.java:125)
at com.sun.java.swing.plaf.nimbus.SynthPainterImpl.paintProgressBarBackground(SynthPainterImpl.java:1066)
at javax.swing.plaf.synth.SynthProgressBarUI.update(SynthProgressBarUI.java:155)
at javax.swing.JComponent.paintComponent(JComponent.java:752)
at javax.swing.JComponent.paint(JComponent.java:1029)
at javax.swing.JComponent.paintChildren(JComponent.java:862)
at javax.swing.JComponent.paint(JComponent.java:1038)
at javax.swing.JComponent.paintChildren(JComponent.java:862)
at javax.swing.JComponent.paint(JComponent.java:1038)
at javax.swing.JComponent.paintChildren(JComponent.java:862)
at javax.swing.JComponent.paint(JComponent.java:1038)
at javax.swing.JLayeredPane.paint(JLayeredPane.java:567)
at javax.swing.JComponent.paintChildren(JComponent.java:862)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5131)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1479)
at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1410)

Exception in thread “Thread: Importação TIPI” java.lang.OutOfMemoryError: Java heap space
at org.apache.xmlbeans.impl.store.Cur.createElementXobj(Cur.java:257)
at org.apache.xmlbeans.impl.store.Cur$CurLoadContext.startElement(Cur.java:2992)
at org.apache.xmlbeans.impl.store.Locale$SaxHandler.startElement(Locale.java:3198)
at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.reportStartTag(Piccolo.java:1082)
at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseAttributesNS(PiccoloLexer.java:1822)
at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseOpenTagNS(PiccoloLexer.java:1521)
at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseTagNS(PiccoloLexer.java:1362)
at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.yylex(PiccoloLexer.java:4678)
at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.yylex(Piccolo.java:1290)
at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.yyparse(Piccolo.java:1400)
at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.parse(Piccolo.java:714)
at org.apache.xmlbeans.impl.store.Locale$SaxLoader.load(Locale.java:3439)
at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1270)
at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1257)
at org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.parse(SchemaTypeLoaderBase.java:345)
at org.openxmlformats.schemas.spreadsheetml.x2006.main.WorksheetDocument$Factory.parse(Unknown Source)
at org.apache.poi.xssf.usermodel.XSSFSheet.read(XSSFSheet.java:142)
at org.apache.poi.xssf.usermodel.XSSFSheet.onDocumentRead(XSSFSheet.java:134)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.onDocumentRead(XSSFWorkbook.java:235)
at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:190)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.(XSSFWorkbook.java:182)
at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:63)
at util.ImportTIPI.run(ImportTIPI.java:42)
at java.lang.Thread.run(Thread.java:662)
CONSTRUÍDO COM SUCESSO (tempo total: 1 minuto 36 segundos)[/code]

[code]

package util;

import gui.util.acomp.MsgAcomp;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import java.util.Observable;
import java.util.Observer;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JDialog;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.ss.util.CellReference;

public class ImportTIPI extends Observable implements Runnable{
private File arquivoTIPI;

@Override
public void run() {
    
    
    notifyObservers(new MsgAcomp(MsgAcomp.INIT_PROC, "Importando arquivo TIPI...TESTE", 0, true)); setChanged();
    
    
    InputStream inp;
    int count = 0;
    try {
        inp = new FileInputStream(arquivoTIPI);
        
        
        Workbook wb = WorkbookFactory.create(inp);
        Sheet sheet1 = wb.getSheetAt(0);
        
        notifyObservers(new MsgAcomp(MsgAcomp.SIZE_PROC, "Importando " + sheet1.getSheetName(), sheet1.getLastRowNum(), false)); setChanged();
        for (Row row : sheet1) {
            notifyObservers(new MsgAcomp(MsgAcomp.RUNNING_PROC, "Importação:" + count, ++count, false)); setChanged();
            
            for (Cell cell : row) {

// CellReference cellRef = new CellReference(row.getRowNum(), cell.getCellNum());
// System.out.print(cellRef.formatAsString());
// System.out.print(" - ");

                switch(cell.getCellType()) {
                      case Cell.CELL_TYPE_STRING:
                        System.out.println(cell.getRichStringCellValue().getString());
                        break;
                      case Cell.CELL_TYPE_NUMERIC:
                        if(DateUtil.isCellDateFormatted(cell)) {
                          System.out.println(cell.getDateCellValue());
                        } else {
                          System.out.println(cell.getNumericCellValue());
                        }
                        break;
                      case Cell.CELL_TYPE_BOOLEAN:
                        System.out.println(cell.getBooleanCellValue());
                        break;
                      case Cell.CELL_TYPE_FORMULA:
                        System.out.println(cell.getCellFormula());
                        break;
                      default:
                        System.out.println();

                }                   
                    
            }
        }
        
        
        
    } catch (IOException ex) {
        Logger.getLogger(ImportTIPI.class.getName()).log(Level.SEVERE, null, ex);
    } catch (InvalidFormatException ex) {
        Logger.getLogger(ImportTIPI.class.getName()).log(Level.SEVERE, null, ex);
    }
    
    notifyObservers(new MsgAcomp(MsgAcomp.END_PROC, "Fim da Importação!", 0, false)); setChanged();
}

public ImportTIPI(JDialog acomp, File pArqTIpi) {
    this.arquivoTIPI = pArqTIpi;
            
    addObserver((Observer) acomp);
    
}

}[/code]

Olá,
Já aumentou a memória da aplicação nessa VM? O Parâmetro -Xmx?
Abraços.

já coloquei 1g e estourou e quando coloquei 2g nem carregou a VM.

Vou tentar 1,5g

se alguem quiser o arquivo excel para testar, favor passar o e-mail, para que eu envie o arquivo zipado em 1.8MB.

1,5 também não deu.

tentei user BufferInputStream, também não deu.