2010-03-29 4 views
1

현재 EAV 모델을 광범위하게 사용하는 프로젝트를 진행 중입니다. 두 엔티티는 속성으로 개별적으로 모델로 표현되며 때로는 다른 모델 (또는 적어도 기본 모델)을 확장합니다.PHP로 큰 (객체) 데이터 세트 처리하기

이것은 응용 프로그램의 대부분 영역이 전체 데이터 집합이 아닌 필터링 된 엔티티 집합에만 의존하기 때문에 지금까지 상당히 효과적이었습니다.

그러나 이제 특성을 기반으로 정렬/필터링 알고리즘을 제공하기 위해 전체 데이터 집합 (IE : 모든 엔터티와 모든 특성)을 구문 분석해야합니다.

현재 응용 프로그램은 약 2200 개의 엔티티로 구성되며 각 엔티티는 약 100 개의 속성을가집니다. 모든 엔터티는 단일 모델 (예 : Client_Model_Entity)로 표현되며 Attribute 개체의 배열 인 $_attributes이라는 보호 된 속성을가집니다.

각 엔티티 개체는 약 500KB이므로 서버에 엄청난 부하가 발생합니다. 2000 개의 엔티티를 사용할 경우 이는 단일 작업이 작동하기 위해 1GB RAM (및 많은 CPU 시간)을 필요로한다는 것을 의미합니다. 이는 받아 들일 수없는 것입니다.

대형 데이터 세트를 반복하는 패턴이나 일반적인 접근법이 있습니까? 정렬 알고리즘을 제공하기 위해서는 모든 것을 고려해야하기 때문에 페이징은 실제로 옵션이 아닙니다.

편집

: 코드 예제는 희망 일을 명확하게하기 :

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

답변

0

하나의 솔루션은 Iterator interface 구현하고 한 번에 하나의 개체를 구문 분석 할 수 있습니다.

1

속성 사이에 공통점이 많은 경우 Flyweight 패턴을 살펴볼 수 있습니다 : http://en.wikipedia.org/wiki/Flyweight_pattern. 이렇게하면 모델을 나타내는 데 필요한 객체 수가 크게 줄어들 수 있습니다.

관련 문제