POI große Exceldatei schreiben

Rahmspinat

Aktives Mitglied
Hallo Leute,

ich schreibe mit POI eine relativ große Exceldatei.
Dabei gehe ich mit dem Scanner Zeile für Zeile eine andere Datei durch und schreibe immer 65000 Zeilen in ein Arbeitsblatt und erstelle dann das nächste.

Zu erwarten sind 400432 Zeilen. (wenn ich nur den Scanner die lines rauslesen lasse läuft das programm durch)

Leider stockt die Funktion, so wie ich sie hier schreibe bei einer Zeile zwischen 240000 - 330000 --> also immer unterschiedlich (bei der gleichen Datei)

Hat einer eine Idee was ich machen kann?


Java:
public void writeExcelData(String tempFilePath) throws Exception{
		long time = System.currentTimeMillis();
		FileOutputStream out = new FileOutputStream("C:/workbook.xls");
		
		HSSFWorkbook wb = new HSSFWorkbook();
		Sheet s = wb.createSheet();
		int i = 0; 
		
		Scanner scanner = new Scanner(new File(tempFilePath));
		
		while(scanner.hasNextLine()) {
			if(i == 65000) {
				System.out.println("Sheet after " + (System.currentTimeMillis() - time));
				i = 0;
				s = wb.createSheet();
			}
			String line = scanner.nextLine();
			Row row = s.createRow(i);
			String[] splitLine = line.split("\t");
			for(int k = 0; k < splitLine.length; k++) {
				Cell cell = row.createCell(k);
				cell.setCellValue(splitLine[k]);
			} 
			splitLine = null;
			line = null;
			i++;
		}
		wb.write(out);
		out.close();
		System.out.println("Gesamter Vorgang " + (System.currentTimeMillis() - time));
	}
 

Geeeee

Bekanntes Mitglied
Mal ohne, dass ich mir vorstellen kann, wieviel Speicher die POI-Sachen bei solchen Größen fressen.

Stocken bedeutet??
Wenn: Wird langsam -> Dein Workbook wird im Speicher gehalten, d.h. es wird immer größer und somit drückt deine Anwendung auf den Speicher. Kann auch daran liegen, dass die "Anfügeoperation" bei großen Dateien einfach ewig dauert.
Hier könntest du z.B. ne riesige Exceldatei nehmen und mal versuchen "unten" was anzufügen. Den Vorgang mal mit dem Einfügen in eine leere Datei vergleichen. Ist zwar sehr ungenau, aber wenn man da einen Unterschied von (beispielhaft) 1 zu 10 Sekunden hat, kann man schon davon ausgehen, dass die Operation mit zunehmender Größe der Exceldatei / des Excelobjekts langsamer wird.
Wenn: Wirft ne Out of Memory Exception -> WB eindeutig zu groß :)
 

Rahmspinat

Aktives Mitglied
Stocken heißt, es hält komplett an. Also Vielleicht gehts ja irgendwann weiter aber eine zeile dauert, selbst wenn ich schon bei 200k Zeilen bin, wesentlich weniger als eine Sekunde.

Und auf einmal hält die Funktion komplett an. Das mein ich mit Stocken (war vielleicht falsch ausgedrückt) :)

Out of Memory problem hab ich nicht, da ich den speicher auf 512mb hochgesetzt und damit war das problem gelöst.

Also an den dingen, die du genannt hast, kann es leider nicht liegen.

Ich habe einen weiteren Test gemacht. Unzwar habe ich immer ein neues Workbook erstellt, statt einem Sheet.
Also so:
Workbook0.xls
workbook1.xls
workbook2.xls
etc.
Da läuft die Funktion problemlos durch.

Ein weiterer test war gewesen, dass ich ein Workbook schreibe, ein Sheet einfüge, 65000 Zeilen hinzufüge und dann Abspeichere, dann neulade und das nächste Sheet anfüge und so weiter.
Leider stopt auch das irgendwann.
 

Geeeee

Bekanntes Mitglied
Ein weiterer test war gewesen, dass ich ein Workbook schreibe, ein Sheet einfüge, 65000 Zeilen hinzufüge und dann Abspeichere, dann neulade und das nächste Sheet anfüge und so weiter.

Das wäre auch meine weitere Idee gewesen. Da er immer unterschiedlich aufhört, hab ich auch gerade keine Idee mehr (Korrupte Zeile in der Quelldatei, zuviel Daten im Sheet etc. kann man ja dadurch ausschließen).
 

Rahmspinat

Aktives Mitglied
Jop,

ach das ärgert mich.

Da will man einen Prozess schön automatisieren, so dass der Benutzer nichtmal ne CSV aus der Excel machen und dann später alles wieder zusammenfrickeln muss und dann hakts an sonem Mist.

Die idee war ja Excel rein -> Blackbox -> Excel raus. Klappt bis auf Excel raus auch alles super :)

Noch jemand eine Idee?
 
S

SlaterB

Gast
wieviel Speicher benötigst du denn von deinen 512 MB?
hier ein Testprogramm mit Speicherausgabe
Java:
public class TestExcel {
    public static void main(String[] args)     throws Exception   {
        FileOutputStream out = new FileOutputStream("C:/Temp/workbook.xls");

        HSSFWorkbook wb = new HSSFWorkbook();
        HSSFSheet s = wb.createSheet();

        long time = System.currentTimeMillis();
        long iTime = time;
        int max = 300003;
        Runtime r = Runtime.getRuntime();
        for (int i = 1; i < max; i++)
        {
            if (i % 20000 == 0)    {
                long newTime = System.currentTimeMillis();

                System.out.println("i: " + i + " - " + (newTime - iTime) + " - mem: " + 
                    (r.totalMemory() - r.freeMemory()) / 1000000);
                iTime = newTime;
                if (i % 60000 == 0)   {
                    System.out.println("new Sheet");
                    s = wb.createSheet();
                }
            }
            HSSFRow row = s.createRow(i);
            for (int k = 0; k < 10; k++)      {
                HSSFCell cell = row.createCell((short)k);
                cell.setCellValue("test");
            }
        }
        wb.write(out);
        out.close();

        long newTime = System.currentTimeMillis();
        System.out.println("Zeit fürs Schreiben: " + (newTime - iTime) + 
              " - mem: " + (r.totalMemory() - r.freeMemory()) / 1000000);
        System.out.println("Gesamter Vorgang " + (System.currentTimeMillis() - time));
    }
}
mit genügend Speicher ist die Ausgabe
Code:
i: 20000 - 1890 - mem: 44
i: 40000 - 2514 - mem: 88
i: 60000 - 2093 - mem: 133
new Sheet
i: 80000 - 1641 - mem: 177
i: 100000 - 2280 - mem: 221
i: 120000 - 1890 - mem: 267
new Sheet
i: 140000 - 1640 - mem: 307
i: 160000 - 1687 - mem: 354
i: 180000 - 2983 - mem: 397
new Sheet
i: 200000 - 1516 - mem: 444
i: 220000 - 1812 - mem: 482
i: 240000 - 1749 - mem: 530
new Sheet
i: 260000 - 1656 - mem: 569
i: 280000 - 3795 - mem: 616
i: 300000 - 2234 - mem: 659
new Sheet
Zeit fürs Schreiben: 3468 - mem: 761
Gesamter Vorgang 34848

mit nur 512 MB
Code:
i: 20000 - 1811 - mem: 44
i: 40000 - 2092 - mem: 88
i: 60000 - 1843 - mem: 132
new Sheet
i: 80000 - 2030 - mem: 177
i: 100000 - 1764 - mem: 219
i: 120000 - 2608 - mem: 263
new Sheet
i: 140000 - 1592 - mem: 308
i: 160000 - 1749 - mem: 352
i: 180000 - 1811 - mem: 396
new Sheet
i: 200000 - 2920 - mem: 440
i: 220000 - 1796 - mem: 481
i: 240000 - 4825 - mem: 525
new Sheet
[10 sec warten]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
 

Rahmspinat

Aktives Mitglied
danke für den TestCode

Übrigens scheint da ein Fehler drin zu sein. Du musst die Zahl bei s.createRow(i);
am besten k nennen und dann immer wieder auf 0 setzen lassen, wenn ein neues Sheet erstellt wird, weil sonst sagt er dir ja, dass du außerhalb des gültigen bereichs bist.


Du wirst sicherlich früher ein OutOfMemory bekommen mit dem Code, weil ich nur 4 Cellen pro Row beschreibe(stand natürlich nicht da) und du gleich 10 stück. Bei mir reicht der Speicher, allerdings könnte ich ihn natürlich sicherheitshalber hochsetzen. Kann auch immer mal mehr werden die ganze Sache. Danke :)


Aber jetzt zur neuen Erkenntnis:
Ich habe festgestellt, dass mein Rechner mehr Zeilen auswertet, wenn z.b. der Firefox zu ist.
Mein Rechner hat zwar noch 1,3 gb Arbeitsspeicher frei kommt aber damit irgendwie nicht klar hab ich dasgefühl.

Ich merk auch immer wenn das Programm läuft (auch wenn die CPU auslastung auf 0 ist) hat er probleme mit anderen Programmen.
Werd mir wohl erstmal nen größeren Arbeitsrechner geben lassen müssen :) bzw den alten aufrüsten.
 

Rahmspinat

Aktives Mitglied
Hej Leute,

danke nochmal an SlaterB und Geeeee. Wie im letzten Post angenommen ist mein Rechner für die ganze Sache, trotz genügend arbeitsspeicher, einfach überlastet gewesen.

Ich habe das Programm fertig geschrieben und auf einen Server geladen. Es läuft einwandfrei. Brauch wohl mal ne bessere kiste :)


Danke nochmal an euch :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Welcher Datentyp für sehr große Zahlenbereiche? Allgemeine Java-Themen 1
F Große Datenmengen effizient programmieren Allgemeine Java-Themen 51
N Das große O berechnen Allgemeine Java-Themen 2
F Best Practice Große Anzahl an Objekten speichern und lesen Allgemeine Java-Themen 19
R Große Zahlen in Worten abkürzen Allgemeine Java-Themen 10
K Große JSON-Dateien schnell und effizient verarbeiten Allgemeine Java-Themen 16
K Große Mengen an Daten speichern Allgemeine Java-Themen 9
VfL_Freak Große und seltsame Probleme nach Java-Update auf V1.8.0_91 Allgemeine Java-Themen 3
E Best Practice Verdammt große Objekte Allgemeine Java-Themen 10
P Große Datenstruktur im Speicher halten Allgemeine Java-Themen 13
M Einfluss von Caching auf die Performance (große Arrays) Allgemeine Java-Themen 24
U Große Liste von Strings mit indiziertem Zugriff Allgemeine Java-Themen 31
P Datentypen Große Datenmenge Sortiert halten Allgemeine Java-Themen 12
D große Textdatei filtern Allgemeine Java-Themen 13
M Große Datei mit Regex durchsuchen Allgemeine Java-Themen 4
R Dateigestützte Collection für große Datenmengen Allgemeine Java-Themen 5
K Scanner - große Textfile, nur 0 ab betim. Wert Allgemeine Java-Themen 4
trash Das große Problem: .jar Archiv Allgemeine Java-Themen 19
J Große Datei einlesen und gestückelt verarbeiten Allgemeine Java-Themen 4
I Große Datei am effektivsten/performantesten auslesen und auswerten? Allgemeine Java-Themen 6
S große CSV-Dateien Importieren. Beste Lösung ?! AWS,S3,Hadoop!? Allgemeine Java-Themen 4
P große double Zahlen und modulo Allgemeine Java-Themen 8
O Große Anzahl Bilder laden Allgemeine Java-Themen 7
A Mit RegEx große Dokumente erfassen Allgemeine Java-Themen 14
X Wie verdammt große Datein öffnen? Allgemeine Java-Themen 2
G Große Datenmengen per JDBC Allgemeine Java-Themen 5
P Große Datenmenge wie speichern (HashMap? TreeMap?) Allgemeine Java-Themen 11
G Große XML-Dateien einlesen und auswerten . Allgemeine Java-Themen 2
P Performance: Ziehen ohne Zurücklegen (große Datenmenge) Allgemeine Java-Themen 10
I JNI - Große Daten übertragen Allgemeine Java-Themen 6
T Große Dateibestände löschen - Speicherproblem Allgemeine Java-Themen 20
S Große ArrayListen Allgemeine Java-Themen 8
S große Datei einlesen! Allgemeine Java-Themen 7
J Große Zahl (double) as text ausgeben? Allgemeine Java-Themen 2
S Kleines Eclipse Problem, große Wirkung Allgemeine Java-Themen 7
H Referenzen statt Objekte für große Speicherstrukturen Allgemeine Java-Themen 19
K Große Herausforderung Allgemeine Java-Themen 2
F Zu große Werte beim byteweisen Lesen mit BufferedReader.read Allgemeine Java-Themen 5
D Große Klasse - was fällt euch so ins Auge? Kritik bitte! Allgemeine Java-Themen 10
M Große Dateien laden Allgemeine Java-Themen 2
F Große Dateien schnell einlesen Allgemeine Java-Themen 14
SexyPenny90 Spalte einer Exceldatei in einem String speichern Allgemeine Java-Themen 11
G Daten aus Exceldatei lesen Allgemeine Java-Themen 8
G Java und Exceldatei Allgemeine Java-Themen 4
N ExcelDatei in .txt umwandeln in Java Allgemeine Java-Themen 9
B Per Java Word Dokument schreiben? Allgemeine Java-Themen 8
Calli11 Was muss ich hier in die Main schreiben, damit das Programm ausgeführt wird? Allgemeine Java-Themen 4
_user_q Eingegebenen Text wiederholt schreiben lassen Allgemeine Java-Themen 9
_user_q JavaFX Robot alle Unicode-Zeichen schreiben lassen können Allgemeine Java-Themen 12
curranux Ausgabe als Textdatei schreiben. Allgemeine Java-Themen 2
B Wie kann ich mein 8 Klassen Gebilde objektorientierter schreiben? Allgemeine Java-Themen 114
Y Wie sinnvolle unit tests schreiben Allgemeine Java-Themen 29
O Test schreiben mit Äquivalenzklassen (Aufgabe Prüfung) Allgemeine Java-Themen 9
S Programm schreiben, das mir aufgrund von Schlagwörtern, die ich im Internet suche, relevante Themen sofort anzeigt. Allgemeine Java-Themen 1
H In jar Resources schreiben? Allgemeine Java-Themen 6
O Wie kann ich in Apache POI (Excel Dateien schreiben) Datumszellen in Excel erzeugen Allgemeine Java-Themen 6
Zrebna Wieviele Testfälle muss man hier schreiben? (Software Engineering) Allgemeine Java-Themen 13
B .txt Datei erstellen und auslesen bzw. schreiben Allgemeine Java-Themen 6
S File lesen und schreiben Java 6 Allgemeine Java-Themen 2
L Erste Schritte Ausdruck schöner schreiben? Allgemeine Java-Themen 8
G Excel File öffnen, in Zelle schreiben, abspeichern Allgemeine Java-Themen 6
S Kann ich eine Methode schreiben die alle Arten von funktionalen Interfaces akzeptiert..? Allgemeine Java-Themen 21
ralfb1105 Blöcke aus Datei filtern/suchen und in neue Datei schreiben Allgemeine Java-Themen 10
D HTTP Http-Link mittels GUI schreiben Allgemeine Java-Themen 5
M In Textdatei schreiben Allgemeine Java-Themen 3
S Input/Output Beste Möglichkeit einen String in einen Datei zu Schreiben Allgemeine Java-Themen 2
Aruetiise " in Datei schreiben Allgemeine Java-Themen 2
D Möglichkeit mit GAE eine Table auszulesen und eine csv zu schreiben Allgemeine Java-Themen 22
K Zusammenfassungen schreiben Allgemeine Java-Themen 2
OnDemand Desktop-Applikation schreiben, wie daten persistent? Allgemeine Java-Themen 9
KeVoZ_ Nacheinander folgende Strings in Textdokument auf neue Zeile schreiben Allgemeine Java-Themen 6
MiMa Log4j in Dateien mit eigenem Namen schreiben Allgemeine Java-Themen 3
A 2D-Grafik Text in ein Bild schreiben Allgemeine Java-Themen 11
M Makrocode von OO in Java schreiben Allgemeine Java-Themen 5
B Animierte Klasse schreiben - Wie? Allgemeine Java-Themen 9
X NetBeans Bilder und andere Dateien ins .jar schreiben und wieder aus .jar lesen Allgemeine Java-Themen 6
D Daten in MySQL-Datenbank schreiben Allgemeine Java-Themen 13
R Signatur von Methoden in eine Datei schreiben? Allgemeine Java-Themen 4
F Fehler in Zeile in Log schreiben Allgemeine Java-Themen 6
F Lesen effizienter als schreiben? Allgemeine Java-Themen 4
H jid3lib nach schreiben keine Tags im Folder angezeigt Allgemeine Java-Themen 1
Z NullPointerException beim Schreiben einer ArrayList in eine Datei Allgemeine Java-Themen 6
B Fortschritt beim Schreiben einer Datei ausgeben lassen Allgemeine Java-Themen 7
F Wert in Variable schreiben, wenn diese gerade genutzt wird Allgemeine Java-Themen 10
U Tiefe Objekte schreiben Allgemeine Java-Themen 1
M Input/Output Datei Schreiben Allgemeine Java-Themen 3
V Eclipse Ich kann bei eclipse nicht schreiben Allgemeine Java-Themen 1
Tobse HTTP REST API's in SQL schreiben Allgemeine Java-Themen 1
B Übergebene Werte in Gerätedatei schreiben Allgemeine Java-Themen 2
2 String Array in Datei schreiben und wieder davon lesen Allgemeine Java-Themen 2
M Methoden jRegistryKey und in die Regitrey schreiben Allgemeine Java-Themen 5
M Text in erstelltes Excelfile schreiben Allgemeine Java-Themen 6
A In Excel-Datei schreiben, Formeln der Mappe anwenden, Wert lesen Allgemeine Java-Themen 3
F Linux & NetBeans: Datei in Systemverzeichnis schreiben? Allgemeine Java-Themen 1
A Input/Output Spätes Schreiben von Dateien der JVM Allgemeine Java-Themen 3
T Input/Output Daten in eine Datei schreiben Allgemeine Java-Themen 4
E wav Datei schreiben mit AudioInputStream Allgemeine Java-Themen 3
T Excel - mit jxf sprachabhängige Formeln schreiben Allgemeine Java-Themen 2
S Java-Programm für "Börsenanalyse" schreiben Allgemeine Java-Themen 4
W Schreiben/Lesen aus RS232 / jssc Allgemeine Java-Themen 0

Ähnliche Java Themen

Neue Themen


Oben