我正在使用Yii 1.1.14和php 5.3在centos 6上我使用CDbCommand从一个非常大的表中获取数据,结果集是10个列的~90,000条记录我将它导出到csv文件,文件大小是大约15MB,脚本总是崩溃没有任何错误消息,只有经过一些研究后我才发现我需要在php.ini中提高memory_limit才能成功执行脚本.唯一的问题是,为了成功执行,我必须将内存限制提高到512MB(!),这是很多!如果10个用户将执行相同的脚本,我的服务器将不会很好地响应...
我想知道是否有人可能知道使用Yii减少sql查询的内存消耗的方法?我知道我可以使用限制和偏移将查询拆分为多个查询,但15MB查询消耗512MB似乎不合逻辑.
这是代码:
set_time_limit(0);
$connection = new CDbConnection($dsn,$username,$password);
$command = $connection->createCommand('SELECT * FROM TEST_DATA');
$result = $command->queryAll(); //this is where the script crashes
print_r($result);
Run Code Online (Sandbox Code Playgroud)
任何想法将不胜感激!
谢谢,
而不是使用将返回单个数组中的所有行的readAll(真正的内存问题在这里),你应该只使用foreach循环(看看CDbDataReader),例如:
$command = $connection->createCommand('SELECT * FROM TEST_DATA');
$rows = $command->query();
foreach ($rows as $row)
{
}
Run Code Online (Sandbox Code Playgroud)
编辑:使用LIMIT
$count = Yii::app()->db->createCommand('SELECT COUNT(*) FROM TEST_DATA')->queryScalar();
$maxRows = 1000:
$maxPages = ceil($count / $maxRows);
for ($i=0;$i<$maxPages;$i++)
{
$offset = $i * $maxRows;
$rows = $connection->createCommand("SELECT * FROM TEST_DATA LIMIT $offset,$maxRows")->query();
foreach ($rows as $row)
{
// Here your code
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1152 次 |
| 最近记录: |