0

我有一个大约 700,000 行的表。

Profile::model()->findAll("country='US'")

我用它来查找所有以“美国”为国家的行。但是执行停止了,我没有得到任何结果。但是后来我添加了如下限制

Profile::model()->findAll("country='US' limit 10000")

然后它起作用了。

为什么执行停止?请帮助我.. 我是 YII 的新手。

4

1 回答 1

2

如果您使用findAll,则将返回所有记录而不受任何限制。但是,CActiveDataProvider如果您不另行说明,则会自动对结果进行分页。如评论中所述,使用findAll. 使用限制或分页(自动应用限制)将返回的行数降低到您的应用程序可以处理的数量。

我建议使用CDataProviderIterator来获取大量活动记录。试试下面的示例代码。

$criteria = new CDbCriteria;
$criteria->compare('country','US');

$Profiles = CDataProviderIterator(
   new CActiveDataProvider(
     'Profile',
      array('criteria'=>$criteria)
   ),
   10000
 );

foreach ($Profiles as $Profile) {
  //do whatever
}

使用迭代器,Yii 将自动一次只获取 10000 条记录(你说这个数字在内存不足的情况下有效),然后在抓取下一页之前将它们从内存中删除。方便地通过foreach循环访问所有记录,而无需您进行任何进一步的工作。

根据需要更改 10000 值以获得所需的结果。此外,请确保您正在监视错误日志以识别内存不足和其他错误。

于 2013-09-08T02:29:02.597 回答