2010-03-29 3 views
1

В настоящее время я работаю над проектом, который широко использует модель EAV. Оба объекта как их атрибуты индивидуально представлены моделью, иногда расширяя другие модели (или, по крайней мере, базовые модели).Обработка больших (объектов) наборов данных с помощью PHP

До сих пор это работало достаточно хорошо, поскольку большинство областей приложения полагаются только на отфильтрованные наборы объектов, а не на весь набор данных.

Теперь, однако, мне нужно разобрать весь набор данных (IE: все сущности и все их атрибуты), чтобы обеспечить алгоритм сортировки/фильтрации на основе атрибутов.

Приложение в настоящее время состоит из приблизительно 2200 объектов, каждый из которых имеет приблизительно 100 атрибутов. Каждый объект представлен одной моделью (например, Client_Model_Entity) и имеет защищенное свойство $_attributes, которое представляет собой массив объектов Attribute.

Каждый объект объекта составляет около 500 КБ, что приводит к невероятной нагрузке на сервер. С 2000 объектами это означает, что для работы одна задача занимает 1 ГБ ОЗУ (и много процессорного времени), что неприемлемо.

Есть ли какие-либо шаблоны или общие подходы к итерации над такими крупными наборами данных? Пейджинг на самом деле не вариант, так как все нужно учитывать, чтобы обеспечить алгоритм сортировки.

EDIT: пример кода, мы надеемся сделать вещи яснее:

// 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. Это может значительно сократить количество объектов, необходимых для представления вашей модели.

Смежные вопросы