2016-08-18 20:41:48 11586次浏览 5条回答 0 悬赏 10 金钱

代码使用的是官方文档中的关于batch以及each的用法。使用中也确实是按文档中的介绍的走的,但是正式环境中的上百万条数据的时候,越往后越慢。并且会报内存超限的错误,貌似是数据库的查询的结果集太大。但是测试机是正常跑完上万条数据的

有没有使用经验的,给出些许的意见。

官方的介绍如下

use yii\db\Query;

$query = (new Query())
    ->from('user')
    ->orderBy('id');

foreach ($query->batch() as $users) {
    // $users 是一个包含100条或小于100条用户表数据的数组
}

// or if you want to iterate the row one by one
foreach ($query->each() as $user) {
    // $user 指代的是用户表当中的其中一行数据
}

  • 回答于 2016-08-24 21:21 举报

    以前yii1的时候处理百万数据的时候都是先计算好了数据库的条数,然后

    for($i = 0; $i < 1000000; $i++)
    

    这样操作的,反正id是主键,单条取值很快的

    1 条回复
    回复于 2016-08-30 11:42 回复

    恩,这种方式相对是原生的写法了,不知道是不是yii的这个each还有这个batch方法用的方式不对还是别的因素

  • 回答于 2016-08-26 09:13 举报

    怕内存超限或者超时,你可以一个请求只处理500条数据,处理完成后,跳下一个同名页面,传个参数指明分页即可。这样可以避免很多问题的。

    3 条回复
    回复于 2016-08-30 11:03 回复

    我是在命令行下(./yii )做数据统计分析用到的这个,并且是每天定时执行的。

    回复于 2016-09-01 15:19 回复

    如果是console跑PHP,那就更简单了,用分页方式取出数据,每500次处理后让脚本睡一会,1秒钟之类的,防止CPU爆炸和内存超限。

    回复于 2016-09-02 09:35 回复

    是的,我就是最后改成了自己写的分页处理的。只是手册上说的,batch和each同样是为了 处理较大数据量的场景的,并且我在用的时候已经显式的使用unset()释放已经处理过的数据,但是目测仍有(内存超限以及速度的)问题

  • 回答于 2016-12-08 11:23 举报

    这个方式batch是用查询生成器(Building Queries)的方式得到100条数据(数组形式)如果要修改还要在里面用findOne()找到对应的这个对象来修改。如果你用了Active Record来使用batch方法,得到的数据是对象形式,这样内存就超限报错。

  • 回答于 2017-08-30 14:49 举报

    楼主,分页的代码发一下呗,我也正在处理这个问题

  • 回答于 2018-06-12 21:17 举报

    你要先设置一下这个PDO::MYSQL_ATTR_USE_BUFFERED_QUERY -> false 然后就可以避免内存泄漏了

您需要登录后才可以回答。登录 | 立即注册
岛主
主管

岛主

注册时间:2015-05-05
最后登录:2018-04-17
在线时长:12小时51分
  • 粉丝2
  • 金钱590
  • 威望0
  • 积分710

热门问题