尝试在块中插入大量数据时,PHP / Mysql“致命错误:允许的内存大小用尽..”

我正在将一个旧的PHP项目迁移到一个新的Laravel应用中。我打算分批迁移几百万个记录表user_category_views。我使用mysqli获取了旧记录,并使用Laravel DB::Statement进行了插入。出于某种原因,大约一百万条记录后,该代码将异常掉:

  

致命错误:允许的内存大小为268435456字节已用尽(试图分配73728字节)

这里的内存溢出了什么?也许$result->free()不能按照我的方式工作?

        $count = 2000000; // actual number will be received from count(*) stmt
        $vendors = [561 => '618',784 => '512' /* and so on */ ];
        $step = 5000;
        for( $i=0; $i<=$count; $i+=$step ){

            $q = "SELECT * FROM `user_category_views` LIMIT $i,$step;";

            if ($result = $this->mysqli->query($q)) {

                $stmt = "INSERT INTO vendor_views (`vendor_id`,`counter`,`created_at`) VALUES";

                /* fetch associative array */
                while ($row = $result->fetch_assoc()) {

                    $vendor_id = null;

                    $id = $row['user_category_id'];

                    // Here I'm trying to prevent Laravel 
                    // from throwing the exception if the entry 
                    // is not found in $vendors array. 
                    // This habit I've gained from js coding  
                    try{
                       $vendor_id = $vendors[$id];
                    } catch (Exception $e) {
                       continue;
                    }

                    if(empty($vendor_id)) continue;

                    $counter = $row['counter'];
                    $created = $row['created'] ;

                    $stmt .= " ($vendor_id,$counter,'{$created}'),";

                }

                $result->free();

                DB::statement( trim($stmt,",") );

                $stmt = null;

            }
        }
higays1 回答:尝试在块中插入大量数据时,PHP / Mysql“致命错误:允许的内存大小用尽..”

感谢Nigel Ren,他指出我滥用了try / catch构造

所以不是

    .....
    try{
        $vendor_id = $vendors[$id];
    } catch (Exception $e) {
        continue;
    }
    ....

我正在使用

$vendor_id = $vendors[$id]??null;

没有更多的内存泄漏问题。不知道为什么,但是现在可以了

,

您的问题是因为您的内存有限。 尝试在PHP文件的顶部进行设置:

ini_set('memory_limit','-1');

增加PHP的内存限制。

如果上述解决方案不起作用。也许您的RAM已经过去了。请检查一下。 您也可以减少步长,例如$ step = 5000;至$ step = 1000;我觉得比较好

希望对您有所帮助。谢谢

本文链接:https://www.f2er.com/3161790.html

大家都在问