Метод красноречивого курсора Laravel и использование памяти генератора PHP - PullRequest
0 голосов
/ 17 октября 2019

Я знаю, что метод 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');
});

Output of the code Как вы можете видеть, он не использует много памяти, потому что он генерирует значение одно за другим и складывает, а не создает весь массив в памяти.

И у 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 enter image description here Я сейчас очень запутался, он использует некоторые memroy, в отличие от предыдущего примера, который используеточень замусоренная память, и я думаю, что она все еще тянет пластинку один за другим. если я использую этот $users = User::all();, он использует гораздо больше памяти о двойном размере этого $users = User::cursor(); одного.

Надеюсь, я высказал свою точку зрения (почему ORM использует немного памяти, тогда как метод генератора не используетлюбой), я думаю, что это не относится к PHP и Laravel, но мне нужен конкретный пример для генераторов и ORM. Если кто-то может объяснить это, то это очень ценится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...