Datei schreiben und Heap Space

fsmarine

Mitglied
Hallo Leute,

ich erzeuge über ein kleines Programm eine Excel-Datei mit Daten die ich aus einer DB heraushole und anschließend in die Excel-Datei schreibe. Das funktioniert auch einwandfrei. Nur erhöhe ich die Anzahl auf mehr als 20000 Datensätze (Oder 5MB xls Datei) bekomme ich eine Heap Space fehlermeldung, zwar beseitigt das zuweisen von mehr Speicher an der VM das Problem - so dass ich 100000 Datensätze reinhauen kann, was ich auch brauche - nur ist das für mich keine angebrachte Lösung (nicht jeder Rechner hat 1gb Ram frei)...

Aus dem Grund bin ich auf der Suche nach einer Alternative :confused:

Hier der Code ich benutze die API jexcelapi_2_6_8 zum schreiben von xls Dateien:

Code:
    private static void createBewegungsdatenExcelFile(String file, boolean all) throws IOException, BiffException, WriteException {
        WritableWorkbook workbook = Workbook.createWorkbook(new File(file));
        // Die Starttabelle erstellen
        WritableSheet sheet = workbook.createSheet("Bewegungsdaten1", 0);;

        // Content hinzufügen
        addContent(sheet, workbook,file);
        
        workbook.write();
        workbook.close();
    }

    private static void addContent(WritableSheet sheet, WritableWorkbook workbook, String file) throws WriteException, IOException, BiffException {
        
        // Formate festlegen
        WritableCellFormat integerFormat = new WritableCellFormat(NumberFormats.INTEGER);
        DateFormat customDateFormat = new DateFormat("dd.MMM.yyyy hh:mm:ss");
        WritableCellFormat dateFormat = new WritableCellFormat(customDateFormat);
        
        ArrayList<Bewegungsdata> bewegungsdaten = 
                new Bewegungsdata().getAllSQLData();
        
        int reserve = 0;
        
        for (int i = 0; i < 100000; i++) {
            Bewegungsdata bdSatz = bewegungsdaten.get(1);

            //Datensätze hinzufügen
            sheet.addCell(convertStringInNumber(0,i+1 - reserve,bdSatz.getGeraetenr(),integerFormat));
            sheet.addCell(new Label(1,i+1 - reserve,bdSatz.getKhnr()));
            sheet.addCell(convertStringInNumber(2,i+1 - reserve,bdSatz.getStnr(),integerFormat));
            sheet.addCell(convertStringInDate(3,i+1 - reserve,bdSatz.getMaanmeldezeit(),dateFormat));
            sheet.addCell(convertStringInNumber(4,i+1 - reserve,bdSatz.getManr(),integerFormat));
            sheet.addCell(new Label(5,i+1 - reserve,bdSatz.getBerufsgruppennr()));
            sheet.addCell(convertStringInDate(6,i+1 - reserve,bdSatz.getBeginn(),dateFormat));
            sheet.addCell(convertStringInDate(7,i+1 - reserve,bdSatz.getVorPat(),dateFormat));
            sheet.addCell(new Label(8,i+1 - reserve,bdSatz.getPatNr()));
            sheet.addCell(convertStringInDate(9,i+1 - reserve,bdSatz.getNachpat(),dateFormat));
            sheet.addCell(convertStringInDate(10,i+1 - reserve,bdSatz.getVoreingruppierung(),dateFormat));
            sheet.addCell(convertStringInNumber(11,i+1 - reserve,bdSatz.getTgruppenr(),integerFormat));
            sheet.addCell(convertStringInNumber(12,i+1 - reserve,bdSatz.getTaetigkeitnr(),integerFormat));
            sheet.addCell(convertStringInDate(13,i+1 - reserve,bdSatz.getNacheingruppier(),dateFormat));
            sheet.addCell(convertStringInDate(14,i+1 - reserve,bdSatz.getVordauer(),dateFormat));
            sheet.addCell(new Label(15,i+1 - reserve,bdSatz.getDummy()));
            sheet.addCell(convertStringInNumber(16,i+1 - reserve,bdSatz.getKette(),integerFormat));
            sheet.addCell(convertStringInDate(17,i+1 - reserve,bdSatz.getNachtaetigkeit(),dateFormat));
            sheet.addCell(convertStringInDate(18,i+1 - reserve,bdSatz.getEnde(),dateFormat));
            sheet.addCell(convertStringInDate(19,i+1 - reserve,bdSatz.getNaechsterbeginn(),dateFormat));
            
            // Eine Tabelle kann nur max. 65500 Datensätze beinhalten
            if(i % 65530 == 0 && i != 0) {
                 sheet = workbook.createSheet("Bewegungsdaten" + ((int) (i/65530)+1), (int) i/65530+1);
                 addHeader(sheet);
                 reserve = i + 1;
            }
        }
    }


P.s: Bin gerade dabei Testweise 100000 Datensätze in die DB zu schreiben, vermutlich gibt es da auch Probleme.
 
workbook.close();

muss wie alle close Aufrufe (z.B. bei FileinputStream) in ein finally{} rein, damit es bei einer möglichen Exception trotzdm geschlossen wird und es somit nicht zu einem Memory leak kommt. Da findest du im Netz sicher genug Beispiele dazu :-)

Leider kenne ich mich mit der Java Excel Schnittstelle nicht so aus. Aber prinzipiell würde ich schauen, ob man das sozusagen Häpchenweise speichern kann. Damit man schnell den Speicher wieder freigeben kann.
 
Code:
workbook.close();

muss wie alle close Aufrufe (z.B. bei FileinputStream) in ein finally{} rein, damit es bei einer möglichen Exception trotzdm geschlossen wird und es somit nicht zu einem Memory leak kommt. Da findest du im Netz sicher genug Beispiele dazu

Also erstmal danke für die Antwort, aber diesen Fehler abzufangen ist im augenblick nicht mein Problem ;)

Code:
Leider kenne ich mich mit der Java Excel Schnittstelle nicht so aus. Aber prinzipiell würde ich schauen, ob man das sozusagen Häpchenweise speichern kann. Damit man schnell den Speicher wieder freigeben kann.

Ich bin mir nicht sicher was du mit "Häpchenweise" meinst!
 
Moin,

naja, ich denke doch mal, das gemeint ist "nicht alle DS in einem Rutsch übertragen", sondern paketweise - vlt. immer 10.000 auf einmal!

Sowas ähnlich handle ich hier bei Socketverbindungen zwischen Client und Server!

Gruß
Klaus
 
hi,
ich habe vor einigen Jahren auch noch mit JExcel gearbeitet (POJ oder wie es heißt war mir zu unverständlich) Soweit ich mich erinnere, ließt JExcel alles ein und will auch alles zum schreiben haben. Sofern dies nicht in den neueren Version diese Bibliothek geändert worden ist oder die alternative eines satzweisen Schreibens angeboten wird, ist dies natürlich ein Manko.
Leider weiß ich im Moment nicht wie aktiv noch an dieser Technologie weitergearbeitet wird. Vielleicht kannst Du dies als Featurewunsch bei den Autoren anbrignen.

viel Glück

Takidoso
 
Zurück