使用PHP处理大型(对象)数据集
问题描述:
我目前正在研究广泛依赖于EAV模型的项目。两个实体作为它们的属性都由一个模型单独表示,有时扩展了其他模型(或者至少是基本模型)。使用PHP处理大型(对象)数据集
迄今为止,这种方法运行良好,因为应用程序的大部分区域只依赖过滤的实体集合,而不是整个数据集。
但是,现在我需要解析整个数据集(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 />';
}
答
如果属性之间有很多共同点,那么可以看看Flyweight模式:http://en.wikipedia.org/wiki/Flyweight_pattern。这可能会显着减少表示模型所需的对象数量。