Php Laravel dabatabse门面内存使用
我发现了用php pdo编写的很好的示例,它有助于迭代大量数据,而无需为整个结果集实际分配内存: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) {
$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
}
});