Speicher leckt Symfony2 Doctrine2 / Speichergrenze überschreiten
eigentlich habe ich eine Menge ärger mit der Kombination von symfony2 und doctrine2. Ich habe zum Umgang mit großen Datenmengen (etwa 2-3 Millionen Lesen und schreiben) und zu tun haben, eine Menge von zusätzlichen Aufwand zu vermeiden, läuft out of memory.
Ich figgured aus 2 Haupt-Punkte, das "Leck"ing-Speicher (Sie sind eigentlich nicht wirklich undicht, aber die Zuteilung einer Menge)
- Den Entitymanager entity-Speicher (ich weiß nicht den richtigen Namen) scheint es, wie es hält alle verarbeiteten entites und Sie haben zu klären, dieser Speicher regelmäßig mit
$entityManager->clear()
- Lehre QueryCache - es speichert alle verwendeten Abfragen und die einzige Konfiguration, die ich fand, war, dass Sie in der Lage sind, zu entscheiden, welche Art von Cache, die Sie verwenden möchten. Ich habe nicht gefunden, ein global deaktivieren Sie weder ein nützliches Merkmal für jede Abfrage zu deaktivieren.
Also in der Regel deaktivieren Sie für jede query-Objekt mit der Funktion$qb = $repository->createQueryBuilder($a); $Abfrage = $qb->getQuery(); $query->useQueryCache(false); $query->execute();
so.. das ist alles, was ich herausgefunden habe, jetzt..
meine Fragen sind:
Gibt es eine einfache Möglichkeit zu leugnen, einige Objekte aus dem Entitymanagerstorage?
Gibt es eine Möglichkeit zum festlegen der querycache Einsatz in der entitymanager?
Kann ich dies konfigurieren, caching-Verhalten somethere in der symonfony Lehre Konfiguration?
Wäre sehr cool, wenn jemand hat ein paar nette Tipps für mich.. ansonsten kann dies einigen geholfen rookie..
cya
InformationsquelleAutor der Frage MonocroM | 2012-03-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist ein wenig spät, aber ich glaube, ich habe gerade ein Google Groups thread auf von Benjamin Eberlei, der Ihre Frage beantwortet: wie bereits von der Lehre Konfiguration Und Referenz standardmäßig Protokollierung von der SQL-Verbindung auf den Wert von kernel.debug, so, wenn Sie instanziiert AppKernel mit debug gesetzt wahr die SQL-Befehle, gespeichert im Speicher, die für jede iteration.
Sollten Sie entweder instanziieren AppKernel zu false, set Protokollierung zu false in Sie config YML, oder legen Sie entweder die SQLLogger manuell auf null vor der Verwendung des EntityManager
InformationsquelleAutor der Antwort Sergi
Versuchen Sie, Ihr Kommando mit --no-debug -. Im debug-Modus die profiler behält Informationen über jede einzelne Abfrage im Speicher.
InformationsquelleAutor der Antwort arnaud576875
1. Deaktivieren Sie die Protokollierung und profiling in
app/config/config.yml
oder im code
2. Force garbage collector. Wenn du aktiv CPU dann garbage collector wartet und Sie finden sich ohne Erinnerung bald.
Zunächst aktivieren Sie die manuelle garbage collection verwalten. Führen Sie
gc_enable()
überall im code. Dann laufengc_collect_cycles()
zu zwingen garbage collector.Beispiel
Wenn deine Tabelle sehr groß ist, verwenden Sie nicht
findAll
. Verwenden iterator - http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/batch-processing.html#iterating-resultsInformationsquelleAutor der Antwort luchaninov
$em->getConnection()->getConfiguration()->setSQLLogger(null);
gc_collect_cycles()
nach$em->clear()
$em->clear();
gc_collect_cycles();
Vergessen Sie nicht die zend.enable_gc zu 1, oder manuell aufrufen, gc_enable() vor der Verwendung gc_collect_cycles()
--no-debug
option, wenn Sie den Befehl ausführen in der Konsole.InformationsquelleAutor der Antwort Sergii Smirnov
habe einige "lustige" Nachrichten aus Lehre Entwickler selbst auf der symfony live in berlin - Sie sagen, dass auf große Chargen, sollte uns nicht die Verwendung eines orm .. es ist einfach kein effizientes bauen sowas in oop
.. ja.. vielleicht hat Sie Recht xD
InformationsquelleAutor der Antwort MonocroM
Wie pro die standard-Doctrine2 Dokumentation, müssen Sie manuell löschen oder detatch Personen.
Zusätzlich zu, dass, wenn die Profilerstellung aktiviert ist (wie in der default-dev-Umgebung). Die DoctrineBundle in Symfony2 wird ein mehrere Holzfäller einiges an Speicher. Sie kann Anmeldung komplett deaktivieren, es ist aber nicht erforderlich.
Einen interessanten Nebeneffekt, der Holzfäller wirken sich sowohl auf die Lehre ORM und DBAL. Ein Logger wird in zusätzlichen memory-Nutzung für jeden Dienst, der verwendet die Standard-logger-Dienst. Deaktivieren Sie alle diese wäre ideal, in der Befehle-da der profiler ist nicht dort noch.
Hier ist was Sie tun können, um deaktivieren der Speicher-intensiv-Logger, während die Profilerstellung aktiviert ist, in anderen teilen des Symfony2:
InformationsquelleAutor der Antwort Reece45
Deaktivieren Sie alle Lehre caches, die es gibt. (Wenn Sie nicht mit dem APC /andere als ein cache dann Speicher verwendet wird).
Entfernen Query-Cache
Es gibt keine Möglichkeit, Global zu deaktivieren, es
Auch dies ist eine alternative, klar, die helfen könnten (von hier)
InformationsquelleAutor der Antwort james_t
Ich habe gerade gebucht ein paar Tipps für die Verwendung von Symfony console-Befehle mit der Lehre für die batch-Verarbeitung hier.
InformationsquelleAutor der Antwort Collin Krawll