2010-03-29 6 views
1

Je travaille actuellement sur un projet qui repose largement sur le modèle EAV. Les deux entités comme leurs attributs sont individuellement représentés par un modèle, étendant parfois d'autres modèles (ou au moins, des modèles de base).Gestion de grands ensembles de données (objet) avec PHP

Cela a fonctionné assez bien jusqu'à présent puisque la plupart des zones de l'application ne reposent que sur des ensembles filtrés d'entités, et non sur l'ensemble de données entier.

Maintenant, cependant, j'ai besoin d'analyser l'ensemble de données complet (IE: toutes les entités et tous leurs attributs) afin de fournir un algorithme de tri/filtrage basé sur les attributs. L'application consiste actuellement en environ 2200 entités, chacune avec environ 100 attributs. Chaque entité est représentée par un modèle unique (par exemple Client_Model_Entity) et possède une propriété protégée appelée $_attributes, qui est un tableau d'objets Attribute.

Chaque objet d'entité est d'environ 500 Ko, ce qui entraîne une charge incroyable sur le serveur. Avec 2000 entités, cela signifie qu'une seule tâche prendrait 1 Go de RAM (et beaucoup de temps CPU) pour fonctionner, ce qui est inacceptable.

Existe-t-il des modèles ou des approches communes pour effectuer des itérations sur des ensembles de données aussi volumineux? La pagination n'est pas vraiment une option, car tout doit être pris en compte pour fournir l'algorithme de tri.

EDIT: un exemple de code pour rendre les choses plus claires, espérons:

// code from the resource model 
for ($i=0,$n=count($rowset);$i<$n;++$i) 
{ 
    $clientEntity = new Client_Model_Entity($rowset[$i]); 
    // getattributes gets all possible attributes from the db and creates models for them 
    // this is actually the big resource hog, as one client can have 100 attributes 
    $clientEntity->getAttributes(); 
    $this->_rows[$i] = $clientEntity; 
    // memory usage has now increased by 500KB 
    echo $i . ' : ' . memory_get_usage() . '<br />'; 
} 

Répondre

0

Une solution pourrait consister à mettre en œuvre le Iterator interface et analyser un objet à l'époque.

1

S'il y a beaucoup de points communs entre les attributs, vous pouvez jeter un coup d'œil au modèle Flyweight: http://en.wikipedia.org/wiki/Flyweight_pattern. Cela peut réduire considérablement le nombre d'objets requis pour représenter votre modèle.

Questions connexes