当使用 CakePHP 查找(“全部”)大量数据时,我内存不足 [我尝试过...编辑]
这是开发团队的Hase。
前几天,
当我尝试使用 CakePHP 使用 find('all') 检索近 100,000 条数据时,内存不足并
出现以下错误。 。
允许的内存大小 134217728 字节已耗尽
因此,我研究了各种节省内存并能够检索近10万行数据的方法。
当前代码
$data = $this->Model->find('all'); // 一些处理......
使用查询()
看起来使用 query() 检索比使用 find('all') 检索更容易处理。
因此,我将其修改为使用 query() 来检索使用 find 检索到的内容。
$data = $this->Model->query("SELECT * FROM hogehoge;"); // 一些处理......
结果
情绪处理变得更容易我感觉就像但,
与我使用 find('all') 检索它时一样,内存不足并且发生错误。
禁用 query() 的缓存
当我查看官方版本时,似乎query()默认有一个缓存查询的机制。
要禁用缓存此查询,
请指定 false 作为第二个参数,例如 query($query, $cachequeries = false)。
因此,我尝试指定 false 作为 query() 的第二个参数。
$data = $this->Model->query("SELECT * FROM hogehoge;", $cachequeries = false); // 一些处理......
结果
总而言之,没有什么特别的变化。 。
使用循环来划分和检索数据
本来,用上面的方法,一次性获取了十万条数据,
内存耗尽也是理所当然的。
所以我尝试使用 limit 和 offset 来划分数据并使用循环处理来获取它。
// 获取数据项数量 $count = $this->Model->find('count'); // 一次获取5000条数据 $limit = 5000; // 循环次数 ({data项目数 ÷ 每次检索的项目数}向上舍入) $loop = ceil($count / $limit); for ($i = 0; $i < $loop; $i++){ // 偏移量 $offset = $ limit * $i; $data = $this->Model->query("select * fromhogehoge as limit {$limit} offset {$offset};", $cachequeries = false); // 一些处理 ... . ……}
结果
这是一个很好的结果。
没有内存错误,数据也被正确检索,所以没有问题! !
因此,如果有人遇到同样的现象,如果您可以将此作为参考,我将不胜感激。
就是这样。
然而,用这种方法...
阅读更多。
当我用 CakePHP 发现(“全部”)大量数据时,内存不足 [已解决] | Beyond Co., Ltd.
如果您觉得这篇文章有帮助,请点赞!