2017-04-20 6 views
1

Ich arbeite mit Java Apache POI-Bibliothek und Umgang mit riesigen Excel-Blätter. ca. 10 MB Daten mit vielen Zeilen und Spalten. Es gibt auch 8-10 verschiedene Blätter in einer Excel-Datei. Die Daten sind nicht im Rich-Text-Format, sondern voll von internen Funktionen und Formeln, z. = SUM(A2:A4) und so weiter, worüber ich keine Bedenken habe.Fehler: GC Overhead Limit überschritten in XSSFWorkbook

Dieses Bild dient nur zur Veranschaulichung. in der tatsächlichen Datenfunktionen sind Art und Weise anders und sehr komplex:

enter image description here

Die Daten enthalten Strings, Zahlen und Boolesche Werte. Meine Sorge ist nur, dass XSSF Werte als normaler Text liest, wobei alle Formeln oder Funktionen ausgeschlossen sind, die in Excel angewendet werden. So zu sagen, in der oberen Bild, ich nur Werte in Zeilen und Spalten lesen mag i.e. 10,20,30 etc, Numbers, Total

Problem

Wenn ich Format Excel-Sheets und alle Formeln und Funktionen entfernen und Daten in einfachem Rich-Text-Format speichern, mein Code läuft. Wenn ich jedoch Excel-Dateien nicht ändere und Daten wie im obigen Format gezeigt verwahre, stoße ich auf GC Overhead-Limit überschritten Fehler.

Was ich

will ich will nur voller Formeln und Funktionen Excel-Dateien lesen, wie sie sind. Mein Algorithmus funktioniert, wenn ich alle Formeln lösche und den Text als normales Rich-Text-Format belasse.

Was habe ich versucht,

Als Online in anderen Ressourcen erwähnt und auf Stackoverflow, habe ich versucht ersten Ansatz wie unten Code angegeben in:

fis = new FileInputStream(path); 
opc = OPCPackage.open(fis); 
XSSFWorkbook workbook = new XSSFWorkbook(opc); 

Anstatt einfach mit FileInputStream für die Eingabe ich zum ersten Mal übergeben es durch OPCPackage. Trotzdem zeigt es denselben Fehler und Code wird nicht ausgeführt unter XSSFWorkbook workbook

Ich habe dann den zweiten Ansatz mit XSSFReader verwendet. Unten ist der Code:

xssfReader = new XSSFReader(opc); 
    SharedStringsTable sst = xssfReader.getSharedStringsTable(); 
    XSSFReader.SheetIterator itr = (XSSFReader.SheetIterator)xssfReader.getSheetsData();     

    while(itr.hasNext()) { 
      InputStream sheetStream = itr.next(); 
      if(itr.getSheetName().equals(sheetName)) { 

       // no idea how to extract sheet like I would do in XSSFWorkbook 
       // I only get Sheet name of desired sheet 

    } // while ends here 

bisher nichts funktioniert für mich und wenn ich XSSFWorkbook verwenden, wird es werfen GC Overhead-Limit Fehler überschritten. Zur Zeit lösche ich manuell alle Formeln und Funktionen und dann funktioniert der Algorithmus, aber es ist nicht effizient, um mit dem Problem umzugehen. Jede Hilfe oder Vorschläge sind willkommen.

EDIT:

Wie in Verbindung zeigte here Ich habe versucht, mehr Zuweisen von Speicher, aber es ist immer noch nicht funktioniert. Unten sind einige Schnappschüsse von mir, die versuchen, mehr Speicher zuzuordnen.

enter image description here enter image description here

Wenn ich bei der Zuweisung von Speicher etwas falsch zu machen bin, lass es mich wissen. Ich werde die notwendige Änderung vornehmen.

Neu Bearbeiten

Ich habe mein Problem gelöst, wie sie durch das Hinzufügen -Xmx8192m meiner laufen Konfigurationen in Eclipse in centic Kommentar unten erwähnt. Ich untersuche nun andere Möglichkeiten zur Lösung des Speicherproblems, indem ich SXSSFWorkbook verwende, wie bereits in der Antwort unten beschrieben.

+0

Mögliche Duplikate von [GC Overhead-Limit überschritten mit Apache POI] (http://StackOverflow.com/Questions/33368612/GC-Overhead-Limit-Exceeded-with-Apache-POI) – huellif

+0

@Huellif Ich versuchte, mehr Speicher zuzuweisen , aber es funktioniert nicht. Ich habe auch meine Frage bearbeitet. – Dhruvify

+2

Die Speichereinstellungen, die Sie anzeigen, sind für Eclipse IDE und Java Webstart. Wie starten Sie Ihre Anwendung? Wenn Sie als Anwendung oder Komponententest innerhalb von Eclipse arbeiten, müssen Sie stattdessen die Speichereinstellungen in der Ausführungskonfiguration anpassen, um sie tatsächlich anzuwenden, wenn Ihr eigener Code ausgeführt wird. – centic

Antwort

1

Kommentar sendet als Antwort:

Des Speichereinstellungen, die Sie anzeigen, sind für Eclipse IDE und Java Webstart, wie starten Sie eigentlich Ihre Anwendung? Wenn Sie als Anwendung oder Komponententest innerhalb von Eclipse arbeiten, müssen Sie stattdessen die Speichereinstellungen in der Ausführungskonfiguration anpassen, um sie tatsächlich anzuwenden, wenn Ihr eigener Code ausgeführt wird.

+0

das hat mein Problem gelöst. Ich habe '-Xmx8192m' zu meinen Run-Konfigurationen in Eclipse hinzugefügt. Vielen Dank. – Dhruvify

0

Haben Sie versucht, die Datei als SXSSF-Arbeitsmappe anstelle einer XSSF-Arbeitsmappe zu öffnen?

fis = new FileInputStream(path); 
opc = OPCPackage.open(fis); 
XSSFWorkbook workbook = new XSSFWorkbook(opc); 
SXSSFWorkbook wb = new SXSSFWorkbook(workbook); 

Siehe https://poi.apache.org/apidocs/org/apache/poi/xssf/streaming/SXSSFWorkbook.html. Genommen directy von ihrem JavaDoc: „Diese sehr große Dateien schreiben kann, ohne als nur ein konfigurierbarer Teil der Zeilen aus dem Speicher ausgeführt werden, im Speicher zu jeder Zeit gehalten“

+0

Ja, ich habe genau das versucht, aber mein Code löst die GC-Begrenzung aus, nachdem die Ausnahme nach 'XSSFWorkbook workbook = new XSSFWorkbook (opc);' code überschritten wurde. Ich verstehe einfach nicht, warum es so ist. Ich habe kein Problem, wenn ich Formeln aus der Excel-Datei entferne. Ich habe eine riesige Menge an Daten. – Dhruvify

+0

Hmm. Funktioniert das? FileInputStream fis = neuer FileInputStream (ExcelFile); \t \t Workbook workBook = neu SXSSFWorkbook (200); \t \t workBook = WorkbookFactory.create (fis); – tomgeraghty3

+0

Ich habe dies jetzt versucht und ich bekomme den gleichen Fehler nach Zeile 'workBook = WorkbookFactory.create (fis);' – Dhruvify

Verwandte Themen