2015-06-26 9 views
5

Sto usando Grails 2.4.4 e sto provando a caricare un file .xlsx usando il plugin 'apache poi', ma sto ottenendo un'eccezione di dimensione dell'heap JAVA quando la dimensione del file è intorno 8 MB.OutOfMemoryError: spazio heap Java per caricare file di dimensioni 8 MB

mio controller ha le seguenti azioni e metodi: -

def uploadForm() {  
     String fileName = "D:\\File.xlsx" 
     Map excelSheetMap = process(fileName) 
} 

Map process(String fileName) { 
    ExcelBuilder excelBuilder = new ExcelBuilder(fileName) 
    //Getting JAVA Heap Size exception here when I am trying to create an object 
    //of ExcelBuilder with the file  
} 

file di classe ExcelBuilder.groovy simile a questa

class ExcelBuilder { 
    Workbook workbook 
    ExcelBuilder(String fileName) {  
     new File(fileName).withInputStream { is -> 
     workbook = new XSSFWorkbook(is) 
     } 
    } 
} 

Ho provato con il plugin graal-Excel-import pure ma sto ottenendo la stessa eccezione.

Qualcuno può suggerire come importare file Excel di grandi dimensioni in Grails. Grazie in anticipo.

+1

Hai provato ad aumentare la memoria app? Per esempio. 'run: [maxMemory: 1280, minMemory: 128, debug: false, maxPerm: 256, forkReserve: true, jvmArgs: jvmArgs]' nel tuo BuildConfig? – defectus

+0

sì, ho già provato questo ma ottenendo lo stesso. –

+1

E se si crea un piccolo progetto (grails-less), script potenzialmente groovy, per testare solo il caricamento del file, funzionerebbe? – defectus

risposta

0

Poi ha un ingombro di memoria elevato. Si prega di vedere: http://poi.apache.org/spreadsheet/index.html

Si può provare SXSSF. SXSSF è un'estensione di XSSF compatibile con API compatibile da utilizzare quando devono essere prodotti fogli di calcolo di grandi dimensioni e lo spazio di heap è limitato.

0

Il problema con questa 'API XSSF' è che quando ho creato l'oggetto radice (cartella di lavoro) per il foglio Excel, lo spazio heap è pieno durante la generazione dell'oggetto e non c'è spazio su heap per la costruzione dell'oggetto cartella di lavoro. Quindi è meno possibile elaborare il foglio dopo aver aumentato le dimensioni dell'heap perché il foglio Excel può essere molto più grande.

new File(fileName).withInputStream { is -> 
     workbook = new XSSFWorkbook(is) 
     //Getting JAVA Heap Size exception here when I am trying to create an object 
     } 

Così dopo alcuni R & D ho trovato un altro API per elaborare grandi "XSSF e SAX (API Event)" foglio Excel cioè. Ma per questo è possibile ottenere i dati XML sottostanti e elaborarli autonomamente.

È possibile trovare la documentazione completa qui- https://poi.apache.org/spreadsheet/how-to.html

Grazie

+0

Perché stai usando un 'InputStream' quando hai un' File'? I documenti sono [abbastanza chiari sul fatto che necessitano di più memoria] (http://poi.apache.org/spreadsheet/quick-guide.html#FileInputStream)! – Gagravarr