使用PHP处理大型(对象)数据集

时间:2010-03-29 18:17:09

标签: php sorting data-structures iteration

我目前正致力于一个广泛依赖EAV模型的项目。两个实体作为其属性由模型单独表示,有时扩展其他模型(或至少扩展基础模型)。

到目前为止,这种方法运作良好,因为应用程序的大多数区域仅依赖于过滤的实体集,而不是整个数据集。

然而,现在,我需要解析整个数据集(IE:所有实体及其所有属性),以便根据属性提供排序/过滤算法。

该应用程序目前包含大约2200个实体,每个实体具有大约100个属性。每个实体都由单个模型(例如Client_Model_Entity)表示,并且具有名为$_attributes的受保护属性,该属性是Attribute个对象的数组。

每个实体对象大约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 />';
}

2 个答案:

答案 0 :(得分:1)

如果属性之间存在很多共性,您可以查看Flyweight模式:http://en.wikipedia.org/wiki/Flyweight_pattern。这可能会显着减少表示模型所需的对象数量。

答案 1 :(得分:0)

一种解决方案可能是实现Iterator interface并在当时解析一个对象。