当使用 CakePHP 查找(“全部”)大量数据时,我内存不足 [我尝试过...编辑]

这是开发团队的Hase。
最近,我尝试
在 CakePHP 中使用 find('all') 函数检索近 10 万条数据,但内存不足,并
出现以下错误:
已用完允许的内存大小 134217728 字节
所以我研究了各种方法来减少内存使用量并检索近 10 万行数据。
当前代码
$data = $this->Model->find('all'); // 执行某些操作 .........
使用 query()
看起来 query() 比 find('all') 更快。
所以我把之前用 find 获取的信息改成了 query()。
$data = $this->Model->query("SELECT * FROM hogehoge;"); // 进行一些处理.........
结果
情绪处理变得更加容易我感觉但,
就像我使用 find('all') 检索时一样,由于内存不足而发生错误。
禁用 query() 缓存
根据官方文档,`query()` 函数默认会缓存查询结果。
要禁用查询缓存,
可以将第二个参数设置为 `false`,例如:
因此,我尝试将 `query()` 函数的第二个参数设置为 `false`。
$data = $this->Model->query("SELECT * FROM hogehoge;", $cachequeries = false); // 进行一些处理 .........
结果
总之,没有发生任何特别的变化。
使用循环分批检索数据
首先,使用上述方法,一次性检索10万条数据,自然
会出现内存不足的情况。
因此,我尝试将数据分割,并使用limit和offset在循环中逐条检索。
// 获取数据项的数量 $count = $this->Model->find('count'); // 一次检索 5000 条数据 $limit = 5000; // 循环次数({数据项总数 ÷ 一次检索的数据项总数} 向上取整) $loop = ceil($count / $limit); for ($i = 0; $i < $loop; $i++){ // 偏移量 $offset = $limit * $i; $data = $this->Model->query("select * from hogehoge as limit {$limit} offset {$offset};", $cachequeries = false); // 进行一些处理 ......... }
结果
结果非常好。
没有出现内存错误,数据也正确检索出来了,所以没有任何问题!
所以,如果有人遇到同样的问题,希望这能有所帮助。
就是这样。
然而,这种方法……
阅读更多:
CakePHP 在使用 find('all') 处理大量数据时内存不足 [解决方案] | Beyond Co., Ltd.
如果您觉得这篇文章有帮助,请点赞!
1