Bobby: Speicherüberlauf bei Erzeugung einer XLS-DAtei

Moin

Ich möchte gern eine Datenbank als XLS ausgeben. Dazu erzeuge ich eine Tabelle aus Datenbankdaten und gebe einfach einen entsprechenden Header mit:

  
header("Content-type: application/vnd-ms-excel");  
header("Content-Disposition: attachment; filename=reifendaten.xls");  

Das ist nicht das Problem. Ich lese also meine Daten aus und möchte diese in ein Array speichern. Das array wird aber so groß, das ein Speicherfehler auftritt.

  
while($reifen=$reifenschnellsuchefac->getElement())  
{  
    if (!$paar[$reifen->id_paar]['hinterrad'] && $reifen->hinterrad==$reifen->artikelnummer)  
    {  
        $paar[$reifen->id_paar]['hinterrad']=utf8_encode($reifen->dimension." - ".$reifen->durchmesser." ".$reifen->kennbuchstaben." - ".$reifen->profil_name);  
    }  
    if (!$paar[$reifen->id_paar]['vorderrad'] && $reifen->vorderrad==$reifen->artikelnummer)  
    {  
        $paar[$reifen->id_paar]['vorderrad']=utf8_encode($reifen->dimension." - ".$reifen->durchmesser." ".$reifen->kennbuchstaben." - ".$reifen->profil_name);  
    }  
    $paar[$reifen->id_paar]['hersteller']=$reifen->firma_name;  
    $paar[$reifen->id_paar]['ccm']=$reifen->ccm;  
    $paar[$reifen->id_paar]['typ']=$reifen->typ_name;  
  
}  

Ich hab edas memory-Limit schon übelst hochgeschraubt. Leider ohne Erfolg. Was kann ich tun?

Gruß Bobby

--
-> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
### Henry L. Mencken ###
-> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
## Viktor Frankl ###
ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
  1. Moin

    OK, Das Objekt, das aus der DAtenbank kam war einfach zu groß. Dieses leere ich bei der Verarbeitung nun schritt für schritt. Und alles funktioniert.

    Gruß Bobby

    --
    -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
    ### Henry L. Mencken ###
    -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
    ## Viktor Frankl ###
    ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
    1. Hi!

      OK, Das Objekt, das aus der DAtenbank kam war einfach zu groß. Dieses leere ich bei der Verarbeitung nun schritt für schritt. Und alles funktioniert.

      Wie genau sieht das "Objekt, das aus der Datenbank kam" aus? Wenn es sich um MySQL handelt, kann man mit einer unbuffered Query Speicher sparen.

      Die verarbeiteten Werte in diesem Fall möglichst gleich auszugeben, anstatt sie gemäß EVA-Prinzip zunächst zu sammeln und dann erst die Ausgabe vorzunehmen, kann in diesem Fall auch zu einem Speichersparen beitragen. Die Anwendung trotzdem nach EVA getrennt aussehen zu lassen, kann man mit etwas Hilfe aus der SPL hinbekommen. Ich denke da an ArrayAccess und/oder Iterator/IteratorAggregate.

      Lo!

      1. Moin

        Wie genau sieht das "Objekt, das aus der Datenbank kam" aus? Wenn es sich um MySQL handelt, kann man mit einer unbuffered Query Speicher sparen.

        mit mysql_fetch_object() werden die Ergebnisse in einem Object bereitgestellt. Dieses Object gehe ich durch und verarbeite die Ergebnisse.

        Die verarbeiteten Werte in diesem Fall möglichst gleich auszugeben, anstatt sie gemäß EVA-Prinzip zunächst zu sammeln und dann erst die Ausgabe vorzunehmen, kann in diesem Fall auch zu einem Speichersparen beitragen. Die Anwendung trotzdem nach EVA getrennt aussehen zu lassen, kann man mit etwas Hilfe aus der SPL hinbekommen. Ich denke da an ArrayAccess und/oder Iterator/IteratorAggregate.

        Leider ist bei diesem Script die vorherige Verarbeitung nach EVA unumgänglich. Werde mir deine geposteten Links aber zu Gemüte führen. Wie gesagt, wenn ich nach der Verarbeitung das Objekt um den Datensatz verringere der verarbeitet wurde, gibt es keinen Speicherüberlauf mehr. Außerdem hatte ich mir unnütze Daten aus der Tabelle geholt.

        Gruß Bobby

        --
        -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
        ### Henry L. Mencken ###
        -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
        ## Viktor Frankl ###
        ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
        1. Hi!

          mit mysql_fetch_object() werden die Ergebnisse in einem Object bereitgestellt. Dieses Object gehe ich durch und verarbeite die Ergebnisse.

          Damit holst du eine Zeile der im Normalfall vollständig intern gepufferten Ergebnismenge. In wie weit sich der interne MySQL-API-Pufferspeicher auf die von PHP eingeschränkte Speichermenge auswirkt ist mir nicht bekannt.

          Wie gesagt, wenn ich nach der Verarbeitung das Objekt um den Datensatz verringere der verarbeitet wurde, gibt es keinen Speicherüberlauf mehr.

          Diese Aussage verstehe ich nicht. Das von der o.g. Funktion zurückgegebene Objekt enspricht jeweils genau einem Datensatz. Meinst du, du hast diese Objekte noch einmal irgendwo abgelegt, in einem Array vielleicht?

          Lo!

          1. Moin

            es steckt ein kleines framework dahinter. Die Ergebnisse werden in einer Liste zwischengespeichert. Das muss ich bei Gelegenheit mal ändern. Zumindest ne Alternative Zugriffsmethode (direkt auf mysql_fetch_object ohne Zwischenspeicherung) hinzufügen.

            Gruß Bobby

            --
            -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
            ### Henry L. Mencken ###
            -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
            ## Viktor Frankl ###
            ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)