Frage

Lehre erscheint weit über 4 MB RAM zu nehmen eine einzige, einfache Abfrage auszuführen:

print memory_get_peak_usage()." <br>\n";
$q = Doctrine_Query::create()
    ->from('Directories d')
    ->where('d.DIRECTORY_ID = ?', 5);

$dir = $q->fetchOne();
print $dir['name']." ".$dir['description']."<br>\n";

print memory_get_peak_usage()." <br>\n";

/***************  OUTPUT:  **************************

6393616
testname testdescription
10999648

/***************************************************/

Dies ist auf einer Testdatenbank mit sehr wenig Daten in ihm -. Das Element, das ich keine anderen Daten als nicht enthalten bin abfragt, was hier angezeigt

Gibt es möglicherweise etwas falsch mit der Art, wie ich das System eingerichtet haben, oder ist dieser Standard Speichernutzung für Lehre?

War es hilfreich?

Lösung

Von dem, was ich sehe, Sie Code scheint nicht falsch zu sein ...


Als Test habe ich ein kurzes Beispiel, mit einer sehr einfachen Tisch (nur vier Felder) einrichten .

Hier ist der relevante Code:

var_dump(number_format(memory_get_peak_usage()));

$test = Doctrine::getTable('Test')->find(1);

var_dump(number_format(memory_get_peak_usage()));

Wenn das zu tun, ich habe diese Art der Ausgabe:

string '1,316,088' (length=9)
string '2,148,760' (length=9)

die Tabelle Betrachtet man ist wirklich einfach, und dass ich nur eine Zeile bin holen, so scheint es „viel“ zu mir zu - aber das ist ganz im Einklang mit dem, was Sie bekommen, und mit dem, was ich an anderen Projekten gesehen: - (


Wenn Sie nur Ihre Daten angezeigt werden, und nicht mit ihm arbeiten (dh update / delete / ...), könnte eine Lösung sein, nicht komplexe Objekte zu holen, sondern nur ein einfaches Array:

$test = Doctrine::getTable('Test')->find(1, Doctrine::HYDRATE_ARRAY);

Aber in diesem Fall ist es nicht viel Unterschied machen, eigentlich :-(:

string '1,316,424' (length=9)
string '2,107,128' (length=9)

Nur 40 KB Unterschied - na ja, mit größeren Objekten / mehr Linien, könnte es noch eine gute Idee sein ...


Im manuellen Lehre gibt es eine Seite mit dem Namen Verbesserung der Leistung ; vielleicht könnte es Ihnen helfen, vor allem für diese Abschnitte:


Oh, btw: Ich habe diesen Test auf PHP 5.3.0; vielleicht kann dies einen Einfluss auf die Größe des Speichers verwendet haben ...

Andere Tipps

ich mit romanb Antwort zustimmen - ein OpCode-Cache ist ein absolutes Muss, wenn große libs / Frameworks.

Ein Beispiel im Zusammenhang mit OpCode Caching

Ich habe vor kurzem Lehre Nutzung mit Zend Framework angenommen und über die Speichernutzung neugierig - so wie die OP, ich eine Methode unter Verwendung von ähnlichen Kriterien für den OPs Test erstellt und lief ihn als Gesamttest, um zu sehen, was ZF + Lehre der Spitze Speichernutzung wäre.

Ich habe folgende Ergebnisse:

Ergebnis ohne APC:

10.25 megabytes
RV David
16.5 megabytes

Ergebnis mit APC:

3 megabytes
RV David
4.25 megabytes

Opcode Caching macht einen sehr signifikanten Unterschied.

Nun, woher kommt diese Speichernutzung kommen? Wie Pascal MARTIN wies darauf hin, hat Array Trink keinen großen Unterschied machen, die in Bezug auf logisch ist, dass wir nur über ein paar Aufzeichnungen sprechen hier.

Der Speicherverbrauch kommt aus allen Klassen, die bei Bedarf durch die automatischen Laden geladen werden.

Wenn Sie nicht haben APC einrichten, dann ja, es ist etwas falsch mit der Art und Weise Ihr System eingerichtet ist. Dont beginnen sogar die Leistung zu messen und gute Ergebnisse bei allen großen PHP-Bibliothek erwarten ohne Opcode Cache wie APC. Es wird nicht nur die Ausführung beschleunigen, sondern auch die Speichernutzung um mindestens 50% auf aller Seite geladen wird, außer dem ersten ein (wo APC muss zwischenzuspeichern den Bytecode zuerst).

reduzieren

Und 4MB mit Ihrem einfachen Beispiel wirklich riecht wie kein APC, sonst wäre es wirklich ein bisschen hoch sein.

Vorsicht bei fetchOne () auf Lehre Abfrage. Dieser Funktionsaufruf wird nicht anhängen „Limit 1“ auf SQL

Wenn Sie nur eine Datensätze aus DB erhalten müssen, stellen Sie sicher:

$q->limit(1)->fetchOne() 

Der Speicherverbrauch ist enorm auf großen Tisch fallen gelassen.

Sie könnten sehen fetchOne () wird von DB holen als eine Sammlung zuerst, dann das erste Element zurück.

public function fetchOne($params = array(), $hydrationMode = null)
{
    $collection = $this->execute($params, $hydrationMode);

    if (is_scalar($collection)) {
        return $collection;
    }

    if (count($collection) === 0) {
        return false;
    }

    if ($collection instanceof Doctrine_Collection) {
        return $collection->getFirst();
    } else if (is_array($collection)) {
        return array_shift($collection);
    }

    return false;
}

Lehre stellt eine freie () Funktion auf Doctrine_Record, Doctrine_Collection und Doctrine_Query, die die zirkuläre Verweise auf diese Objekte eliminiert, so dass sie sich für die Garbage Collection zu befreien. Mehr Infos ..

Um die Speichernutzung ein bisschen weniger machen können Sie versuchen, Folowing Code zu verwenden:

  • $ rekord> kostenlos (true) - wird tief frei-up ist zu tun, ruft free () auf alle Beziehungen zu
  • $ Kollektion-> free () - dies wird alle Sammlung Referenzen frei
  • Doctrine_Manager :: Anschluss () -> sauber () / clear () - Cleanup-Verbindung (und Identitätszuordnungseinträge entfernen)
  • $ query-> free ()

Ich würde vermuten, dass die meisten dieser Speicher verwendet wird Lehre der Klassen Laden auf, nicht wirklich für Objekte mit der Abfrage selbst zugeordnet ist.

  • Welche Version von Lehre verwenden Sie?
  • Sind Sie mit dem Autoloader?

In Lehre 1.1 wird das Standardverhalten automatisch geladen ‚aggressiv‘ bezeichnet, was bedeutet, dass sie alle Ihre Modellklassen laden auch wenn Sie nur eine oder zwei auf einer bestimmten Anforderung mit. dieses Verhalten auf ‚konservativ‘ würde die Speichernutzung reduzieren.

Ich habe gerade tat „daemonisierte“ Skript mit symfony 1.4 und Einstellung der folgenden gestoppt, um den Speicher hogging:

sfConfig::set('sf_debug', false);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top