Обработка больших (объектных) наборов данных с помощью PHP - PullRequest
1 голос
/ 29 марта 2010

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

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

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

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

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

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

РЕДАКТИРОВАТЬ: пример кода, который, как мы надеемся, прояснить ситуацию:

// 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 ]

1 голос
/ 16 июля 2010

Если между атрибутами есть много общего, вы можете взглянуть на шаблон Flyweight: http://en.wikipedia.org/wiki/Flyweight_pattern. Это может значительно уменьшить количество объектов, необходимых для представления вашей модели.

0 голосов
/ 29 марта 2010

Одним из решений может быть реализация интерфейса Iterator и анализ одного объекта за раз.

...