Php Laravel dabatabse门面内存使用

Php Laravel dabatabse门面内存使用,php,laravel,memory,pdo,Php,Laravel,Memory,Pdo,我发现了用php pdo编写的很好的示例,它有助于迭代大量数据,而无需为整个结果集实际分配内存: $sql = 'SELECT * from playlists limit 50000'; $statement = $pdo->prepare($sql); $statement->execute(); while (($result = $statement->fetch(PDO::FETCH_ASSOC)) !== false) {

我发现了用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的
light/database
组件和非常类似的方法
DB::table('playlists')->limit(50000)->get()
还使用
35mb的内存

  • 如何使用Laravel的雄辩或DB facade实现第一种方法
  • 你能推荐一些文章来说明这种内存使用的差异是如何发展的吗

感谢

像这样处理大型数据集的Laravel方法可以使用


这确保了一次加载到RAM中的数据块大小(在我的示例中为1000行)不会超过这个数据块大小。1k是任意的;当您使用php(mysql函数或PDO)执行SQL查询时,可以将1100、253等数据块作为“结果集”加载到内存中

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

PDOStatement::fetch-从内存中的结果集中提取一行

PDOStatement::fetchAll-将结果集中的所有行提取到内存中,从而使内存使用率加倍

有口才的人有能力处理结果集。这相当于在PDO中执行“X倍提取”


但是,如果你使用非常大的结果集,考虑使用SQL限制。

你是否喜欢类似的?Laravel框架有自己的开销。在不执行查询的情况下检查Laravel的内存使用情况,并检查执行查询时增加的内存使用情况。将其与查询前后没有Laravel的内存使用情况进行比较如果您想将其限制在最大50k行,则需要执行一些逻辑来跟踪循环中的迭代。假设我按100分块。因此,每个区块执行将为100行或仅一行分配内存?@EvaldasButkus每个区块执行一次向内存加载100行。在第二个块中,第一个块被第二个块覆盖。因此,理论上,峰值内存使用率应该是结果集+块大小。
DB::table('playlists')->chunk(1000, function($playlists) use($count) {
    foreach($playlists as $playlist) {
        // do something with this playlist
    }
});