Laravel Dabatabse立面记忆使用情况



我找到了在PHP PDO中编写的很好的示例,该示例有助于迭代大量数据,而无需实际分配整个结果的内存:

    $sql = 'SELECT * from playlists limit 50000';
    $statement = $pdo->prepare($sql);
    $statement->execute();
    while (($result = $statement->fetch(PDO::FETCH_ASSOC)) !== false) {
        //do something
    }

我已经进行了调查,这种方法使用内存的18mb

如果我获取所有结果,例如此 $results = $statement->fetchAll(PDO::FETCH_ASSOC);内存使用率上升到 35mb

使用Laravel的illuminate/database组件和非常相似的方法DB::table('playlists')->limit(50000)->get();也使用内存的35mb

  • 如何使用Laravel的雄辩或DB立面实现第一次方法?
  • 您能建议一些文章如何发展记忆使用中的这种差异?

谢谢

使用PHP执行SQL查询(MySQL功能或PDO)时,所有从查询加载到内存中返回的数据作为"结果集"。

为了在"结果集"中使用数据,您必须在常规的PHP数组/对象中获取它们。

pdostatement :: fetch - 从结果设置为内存中的一行。

pdostatement :: fetchall - 从结果设置到存储器的所有行都会加倍内存使用。

雄辩具有缩小结果集的能力。这相当于在PDO中执行" X Times Fetch"。

但是,如果您正在使用非常大的结果集,请考虑使用SQL限制。

laravel处理这样的大数据集的方法是使用块。

DB::table('playlists')->chunk(1000, function($playlists) use($count) {
    foreach($playlists as $playlist) {
        // do something with this playlist
    }
});

这确保不超过块大小(在我的示例中,1000行)一次加载到RAM中。1K是任意的;您可以缩小1、100、253等。

最新更新