Umgang mit großen Doktrinen Sammlungen und Assoziationen

8

Ich arbeite an einem Projekt, bei dem ich eine Menge Daten aus der Datenbank sammeln muss. Ich benutze Symfony2 (symfony bf1281aebdc842a39ec0eb7438e1ea3fca9b9705) und Doctrine2 (Doktrin 3b3186ee98392802a44118cd421a3530119aa7eaand) als Arbeitsgrundlage.

Das Problem, auf das ich stoße, ist, dass ich ungefähr 15.000 Artikel abholen muss. Danach muss ich alle durchlaufen und mehr Daten auf Basis der Artikel-ID abrufen (es gibt direkte und indirekte Assoziationen mit d. H. (Vererbten) Medien oder Preisen usw.). Es ist in Ordnung für etwa 50-100 Datensätze, aber wenn ich mehr Datensätze verwenden möchte, dauert es sehr viel Zeit, um alles aus der Datenbank zu holen.

Gibt es eine Möglichkeit, die Daten zu durchlaufen, ohne den gesamten verbleibenden RAM zu verbrauchen? Gibt es eine Möglichkeit, der Lehre zu sagen, dass sie aufhören soll, Referenzen zu verwenden?

Vielen Dank im Voraus für jede Hilfe!

    
user969476 28.09.2011, 16:12
quelle

5 Antworten

6

Speichern Sie eine andere Zeile mit:

%Vor%     
user2815640 25.09.2013 14:05
quelle
3

Schwer zu beantworten, ohne genauere Angaben darüber, was Sie genau machen wollen.

Die Lehre passt im Allgemeinen nicht zu den wichtigsten Datenverarbeitungsproblemen, wie Sie es vielleicht beschreiben. Ich habe mehrere Projekte, die auf DBAL zurückgreifen, um rohe SQL für Dinge wie komplizierte Berichte zu laufen.

Wenn Sie nicht alle 15k-Datensätze gleichzeitig laden möchten, laden Sie sie nicht gleichzeitig! Ergreifen Sie 50, verarbeiten Sie sie, geben Sie Speicher frei und wiederholen Sie sie. Dieser Ansatz kann die Gesamtsummen beibehalten, so dass es möglich ist, einige zusammengefasste Statistiken für den gesamten Satz zu erhalten.

Wenn Sie Aggregatkram brauchen, bauen Sie wahrscheinlich eine Art "Bericht" auf, und Sie könnten besser mit reinem SQL oder sogar mit einigen gespeicherten Prozeduren arbeiten und das ORM nicht zulassen mach mit.

    
timdev 29.09.2011 02:42
quelle
3

Sie können in idiative (Schritt-für-Schritt) Hydratation in Doctrine:

nachschauen %Vor%

Details von dieser Artikel , unter Massenobjektverarbeitung

    
Jrgns 24.01.2012 10:57
quelle
1

Es gibt tatsächlich einen anderen Weg, aber Sie werden es nicht mögen. Sie können pure mysql verwenden :) Als ich mit getRepository ("..") 450k Objekte aus der Datenbank holen wollte - & gt; findAll () - dauerte es Stunden, bis ich das Skript geschlossen habe :). Also habe ich Code wie

benutzt %Vor%

Ich habe das erste Objekt nach 1,7 Sekunden , was absolut akzeptabel für mich ist. Außer unordentlichen Code: (

Nachdem ich ein bisschen gegoogelt habe, habe ich dich gefragt und doctrine manuall . Nach dem Umschreiben bekam ich Code

%Vor%

Code oben zur Verfügung gestellt erste Element in 2,4 Sekunden , die extrem schnell ist, wie für die Doktrin2 und 450k Elemente in der Tabelle.

Mein Punkt ist - Doctrine2 hat schon fast alles, was Sie für den "echten" Gebrauch brauchen, aber Sie können Ihr Leben immer noch mit old school hässlichem Code vereinfachen:)

UPDATE: Vergessen Sie nicht, alle geladenen Objekte in Kaskade zu trennen. Und in Symfony2 müssen Sie auch die SQL-Protokollierung deaktivieren, indem Sie Code

ausführen %Vor%     
Andrew Zhilin 13.07.2013 09:40
quelle
0

Aus der Doktrin Dokumentation :

%Vor%     
Jekis 18.03.2015 19:41
quelle

Tags und Links