用PHP处理大型(对象)数据集
我目前正在从事一个广泛依赖EAV模型的项目。两个实体作为其属性分别由一个模型表示,有时扩展其他模型(或至少扩展基础模型) 到目前为止,这已经非常有效,因为应用程序的大多数区域只依赖于过滤的实体集,而不是整个数据集 但是,现在我需要解析整个数据集(即:所有实体及其所有属性),以便提供基于属性的排序/过滤算法 该应用程序目前大约由2200个实体组成,每个实体大约有100个属性。每个实体都由单个模型表示(例如用PHP处理大型(对象)数据集,php,sorting,data-structures,iteration,Php,Sorting,Data Structures,Iteration,我目前正在从事一个广泛依赖EAV模型的项目。两个实体作为其属性分别由一个模型表示,有时扩展其他模型(或至少扩展基础模型) 到目前为止,这已经非常有效,因为应用程序的大多数区域只依赖于过滤的实体集,而不是整个数据集 但是,现在我需要解析整个数据集(即:所有实体及其所有属性),以便提供基于属性的排序/过滤算法 该应用程序目前大约由2200个实体组成,每个实体大约有100个属性。每个实体都由单个模型表示(例如客户机\u模型\u实体),并具有一个名为$\u属性的受保护属性,该属性是属性对象的数组 每个实
客户机\u模型\u实体
),并具有一个名为$\u属性
的受保护属性,该属性是属性
对象的数组
每个实体对象大约为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 />';
}
//来自资源模型的代码
对于($i=0,$n=count($rowset);$igetAttributes();
$this->_行[$i]=$clientEntity;
//内存使用现在增加了500KB
echo$i.':'.memory_get_usage()。
;
}
一种解决方案可以是同时实现和解析一个对象。一种解决方案可以是同时实现和解析一个对象。如果属性之间有很多共同点,您可以查看Flyweight模式:。这可能会显著减少需要重显的对象数量nt您的模型。如果属性之间有很多共性,您可以查看Flyweight模式:。这可能会显著减少表示模型所需的对象数量