当使用 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
加载中...
1 票,平均:1.00 / 11
8,114
X Facebook 哈特纳书签 口袋

写这篇文章的人

关于作者

长谷达也

应届毕业生加入Beyond Co., Ltd.。

我们开发网络系统(开发在浏览器上运行的服务和系统,例如网络服务、数字内容和业务管理系统)和游戏API(开发与应用程序游戏通信的程序)。

我们还为 Shopify 开发私人/自定义应用程序。

原本在大阪事务所工作,2019年调到横滨事务所。
我的爱好是棒球/卡拉OK/动漫