我找到了在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等。