10
votes

Comment gérer de grandes collections et associations de doctrine

Je travaille sur un projet où je dois collecter beaucoup de données de la base de données. J'utilise symfony2 (symfony bf1281aebdc842a39ec0eb7438e1ea3fca9b9705) et doctrine2 (doctrine 3b3186ee98392802A44118CD421A35318CD421A3530119AA7AEAINT) Base de travail.

Le problème que je rencontre est que je dois chercher environ 15 000 articles. Après cela, j'ai besoin de itérair à tous une extraction à tous une extraction plus de données sur la base de l'ID d'article (il existe des associations directes et indirectes avec I.E. (héritée) média ou prix, etc.). C'est bon pour environ 50-100 enregistrements, mais si je veux utiliser plus d'enregistrements, il faut beaucoup de bélier un temps pour tout chercher de la base de données.

Y a-t-il un moyen de parcourir les données sans utiliser tout le RAM restant? Existe-t-il un moyen de dire à la doctrine d'arrêter d'utiliser des références?

Merci d'avance pour toute aide!


0 commentaires

5 Réponses :


3
votes

difficile à répondre sans plus de détails sur ce que vous essayez de faire, exactement.

La doctrine n'est généralement pas un bon ajustement pour que les données majeures - crunching telles que vous puissiez décrire. J'ai plusieurs projets qui sont en train de faire tomber simplement sur Dbal pour exécuter SQL cru pour des choses comme des rapports compliqués.

Cela dit, si vous n'avez pas besoin de tous les 15k enregistrements chargés à la fois, ne les chargez pas à la fois! Prenez 50, processus les traiter, la mémoire libre et la répétition. Cette approche peut garder les totaux à mesure que vous allez, il est donc possible d'obtenir des statistiques globales pour l'ensemble.

Cela dit, si vous avez besoin d'éléments agrégés, vous construisez probablement une sorte de "rapport", et vous pourriez bien être mieux à utiliser de PURE SQL, voire certaines procédures stockées, et ne laissez pas l'orme s'impliquer.


1 commentaires

Et dites-moi, dans quelle application axée sur Symfony pourriez-vous avoir besoin de 15k enregistrements à la fois? Seuls les documents miniers ont besoin de nombreuses données et il ne faut pas être alimentée par Symfony.



4
votes

Vous pouvez rechercher à l'aide d'une hydratation itérative (étape par étape) dans la doctrine: xxx

détails de Cet article , sous Objet de masse Traitement


1 commentaires

FYI: Le lien est cassé



1
votes

Il y a en fait d'une autre manière, mais vous ne l'aimerez pas. Vous pouvez utiliser pure mysql :) Lorsque j'ai essayé d'obtenir des objets 450K de la base de données à l'aide de getRePository ("..") -> Findall () - Il a pris des heures jusqu'à ce que je ferme le script :). J'ai donc utilisé le code comme xxx pré>

j'ai eu le premier objet après 1,7 seconde forte>, qui est absolument acceptable pour moi. Sauf code désordonné: ( P>

Après avoir googling un peu, je vous ai trouvé la question et Doctrine Manuall . Après la réécriture, j'ai obtenu le code P>

    $doctrine->getConnection()->getConfiguration()->setSQLLogger(null);


0 commentaires

6
votes

Enregistrer une autre ligne à l'aide de:

$iterableResult = $doctrine->getManager()->createQuery("SELECT c FROM ENTITY c")->iterate();

while ((list($obj) = $iterableResult->next()) !== false) {
    // do something with $obj
    $em->detach($obj);
}


0 commentaires

0
votes

de la doctrine Documentation : xxx


0 commentaires