PHP ile büyük (nesne) veri setlerini Taşıma

2 Cevap php

Şu anda yoğun EAV modeline dayanan bir proje üzerinde çalışıyorum. Onların nitelikleri hem kişiler tek tek bazen diğer modellerinin geliştirilmesi (ya da en azından, temel modeller), model tarafından temsil edilmektedir.

Bu şimdiye kadar uygulamanın en alanları sadece varlıkların filtre setleri değil, tüm kümesi itimat beri oldukça iyi çalıştı.

Niteliklerine dayanarak bir sıralama / filtreleme algoritması sağlamak amacıyla: Şimdi, ancak ben tüm veri kümesini (tüm varlıklar ve tüm nitelikleri IE) ayrıştırmak gerekiyor.

Uygulama şu anda Yaklaşık olarak 2200 kuruluşlar, Yaklaşık olarak 100 nitelikleri ile her oluşur. Her varlık (örneğin, Client_Model_Entity) tek bir model ile temsil ve Attribute nesnelerinin bir dizisi $_attributes adlı bir koruma özelliği vardır.

Her varlık nesne sunucu üzerinde inanılmaz bir yük sonuçlanır 500KB, ilgili. 2000 kuruluşlar ile, bu tek bir görev kabul edilemez olduğu, çalışmak için 1GB RAM (ve CPU çok zaman) alacaktı demektir.

Her sıralama algoritması sağlamak amacıyla dikkate alınması gerektiği için Are there any patterns or common approaches to iterating over such large datasets? Çağrı, gerçekten bir seçenek değildir.

EDIT:, umarım daha net şeyler yapmak için bir kod örneği:

// 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 />';
}

2 Cevap

Nitelikleri arasındaki ortak bir şey var ise, Sinek siklet desen bakmak olabilir: http://en.wikipedia.org/wiki/Flyweight_pattern. Bu önemli ölçüde modeli temsil etmek için gerekli nesnelerin sayısını azaltabilir.

Bir çözüm Iterator interface uygulamak ve her seferinde bir nesneyi ayrıştırmak için olabilir.