tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
4
ZUGRIFFE
897
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    fsmarine fsmarine ist offline Mitglied Bronze
    Registriert seit
    Feb 2008
    Beiträge
    37
    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

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

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    
        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.
     

  2. #2
    Anime-Otaku Anime-Otaku ist offline Mitglied Brillant
    Registriert seit
    Aug 2005
    Ort
    Karlsruhe (Baden-Württemberg)
    Beiträge
    905
    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.
     
    Wäre super wenn ihr euren Code in dieser Form einfügt:
    Code java:
    1
    
    System.out.println("Hello World");
    [java]System.out.println("Hello World");[/java]
    Für erledigte Threads dürft ihr den "erledigt"-Button anklicken!
    Über Dank freut sich jeder, der euch geholfen hat - ein Klick auf "Danke" kostet ja nicht mal was
    Blog: http://javaeffective.wordpress.com/

  3. #3
    fsmarine fsmarine ist offline Mitglied Bronze
    Registriert seit
    Feb 2008
    Beiträge
    37
    Code :
    1
    2
    3
    
    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 :
    1
    
    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!
     

  4. #4
    Avatar von vfl_freak
    vfl_freak vfl_freak ist offline Mitglied Diamant
    Registriert seit
    Aug 2007
    Ort
    Niedersachsen
    Beiträge
    2.161
    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
     
    Es ist noch kein Meister vom Himmel gefallen - sonst hätte man schon längst seine Leiche gefunden !!

    Falls ich helfen konnte, wäre eine Bewertung oder ein Danke nett ;-)
    -------------------------------------------------------------------------------------------------
    Ich beantworte keine Fragen per PN !!
    Stellt Eure Fragen im Forum - dann haben alle etwas davon !!

  5. #5
    Avatar von takidoso
    takidoso takidoso ist offline Mitglied Brillant
    Registriert seit
    Aug 2004
    Ort
    Kömigstein
    Beiträge
    911
    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
     

Ähnliche Themen

  1. [Glassfish] Genaue Anleitung zur Erweiterung des heap space
    Von Bexx im Forum Hosting & Webserver
    Antworten: 0
    Letzter Beitrag: 10.03.10, 11:55
  2. java heap space problem
    Von avi im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 0
    Letzter Beitrag: 27.11.09, 10:43
  3. MySql JTable Probleme mit Heap Space
    Von PUM1212 im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 0
    Letzter Beitrag: 03.12.07, 03:33
  4. Heap Space - System.setProperty()?
    Von flashray im Forum Java
    Antworten: 9
    Letzter Beitrag: 24.05.07, 13:08
  5. Applet heap space
    Von magnet im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 0
    Letzter Beitrag: 29.11.05, 13:06