2015-06-26 8 views
5

Ich benutze Grails 2.4.4 und versuche, eine .xlsx-Datei mit dem 'Apache Poi' Plugin hochladen, aber ich bekomme JAVA Heap-Größe Ausnahme, wenn die Dateigröße ist 8 MB.OutOfMemoryError: Java-Heap-Speicherplatz zum Hochladen von 8 MB Dateigröße

Mein Controller verfügt über folgende Aktion und Methoden: -

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  
} 

ExcelBuilder.groovy Klasse-Datei sieht so etwas wie dies

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

ich versucht habe, als auch die Grails-Excel-Import-Plug-in aber ich bekomme die selbe Ausnahme.

Kann jemand bitte vorschlagen, wie große Excel-Dateien in Grails zu importieren. Danke im Voraus.

+1

Haben Sie den App-Speicher zu erhöhen versucht? Z.B. 'run: [maxMemory: 1280, minMemory: 128, debug: false, maxPerm: 256, forkReserve: true, jvmArgs: jvmArgs]' in Ihrer BuildConfig? – defectus

+0

ja, das habe ich schon ausprobiert aber gleich bekommen. –

+1

Und wenn Sie ein kleines Projekt (Grails-less), möglicherweise groovy Skript, nur das Laden der Datei zu testen, würde es funktionieren? – defectus

Antwort

0

Poi hat einen hohen Speicherbedarf. Bitte sehen Sie: http://poi.apache.org/spreadsheet/index.html

Sie können versuchen, SXSSF. SXSSF ist eine API-kompatible Streaming-Erweiterung von XSSF, die verwendet werden soll, wenn sehr große Tabellenkalkulationen erstellt werden müssen und der Heap-Speicherplatz begrenzt ist.

0

Das Problem mit dieser 'XSSF-API' ist, dass, wenn ich das Stammobjekt (Arbeitsmappe) für das Excel-Blatt erstellt habe, der Heap-Speicher voll ist, während das Objekt erzeugt wird und es keinen Speicherbereich für das Arbeitsmappenobjekt gibt. Daher ist es weniger möglich, das Blatt nach dem Vergrößern der Heap-Größe zu bearbeiten, da Excel-Sheets viel größer sein können.

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

also nach einiger R & D habe ich eine weitere API gefunden großen Excel-Blatt d.h. "XSSF und SAX (Ereignis API)" zu verarbeiten. Dafür können Sie die zugrunde liegenden XML-Daten abrufen und selbst bearbeiten.

können Sie die komplette Dokumentation finden hier- https://poi.apache.org/spreadsheet/how-to.html

Dank

+0

Warum verwenden Sie einen 'InputStream', wenn Sie eine' Datei' haben? Die Dokumente sind [ziemlich klar, dass mehr Speicher benötigt wird] (http://poi.apache.org/spreadsheet/quick-guide.html#FileInputStream)! – Gagravarr

Verwandte Themen