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:
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.
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.
Mögliche Duplikate von [GC Overhead-Limit überschritten mit Apache POI] (http://StackOverflow.com/Questions/33368612/GC-Overhead-Limit-Exceeded-with-Apache-POI) – huellif
@Huellif Ich versuchte, mehr Speicher zuzuweisen , aber es funktioniert nicht. Ich habe auch meine Frage bearbeitet. – Dhruvify
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