Я знаю, что метод Larevel cursor
использует LazyCollection и функцию генератора PHP, но я довольно смущен использованием памяти, вот некоторый код, который у меня есть.
function generator($max)
{
for ($i = 0; $i < $max; $i++) {
yield $i;
}
}
Route::get('/', function () {
dump(memory_usage());
$g = generator(5000000);
$count = 0;
foreach ($g as $a) {
$count += $a;
}
dump($count);
dump(memory_usage());
dump('done');
});
Как вы можете видеть, он не использует много памяти, потому что он генерирует значение одно за другим и складывает, а не создает весь массив в памяти.
И у Laravel также есть похожая особенность - метод cursor
. (У меня 25000 записей пользователя в БД)
Route::get('/', function () {
dump(memory_usage());
$users = User::cursor();
$count = 0;
foreach ($users as $a) {
$count += 1;
}
dump($count);
dump(memory_usage());
dump('done');
});
Вот optput Я сейчас очень запутался, он использует некоторые memroy, в отличие от предыдущего примера, который используеточень замусоренная память, и я думаю, что она все еще тянет пластинку один за другим. если я использую этот $users = User::all();
, он использует гораздо больше памяти о двойном размере этого $users = User::cursor();
одного.
Надеюсь, я высказал свою точку зрения (почему ORM использует немного памяти, тогда как метод генератора не используетлюбой), я думаю, что это не относится к PHP и Laravel, но мне нужен конкретный пример для генераторов и ORM. Если кто-то может объяснить это, то это очень ценится.