TGViewer
Пых Пых @phpyh · 7.82K subscribers
Post #436 8.14K
Как разбить итератор на батчи?

Представим, что нам надо распарсить какой-то гигантский документ и сформировать вставки в базу по 10к элементов. Для решения этой задачи не обязательно писать кастомный итератор, можно всё сделать "на коленке". Оборачиваем генератор с распарсенными данными в NoRewindIterator, чтобы избежать его перемотки, а затем применяем LimitIterator до тех пор, пока не закончатся данные:

final readonly class Importer
{
private const BATCH_SIZE = 10_000;

public function __construct(private Connection $connection) {}

public function import(): void
{
foreach ($this->parseBatched() as $batch) {
$sqlValues = '';
$values = [];

foreach ($batch as $value) {
$sqlValues .= ($sqlValues === '' ? '' : ',') . '(?)';
$values[] = $value;
}

$this->connection->execute(
'insert into data (val) values ' . $sqlValues,
$values,
);
}
}

private function parseBatched(): Generator
{
$parsed = new NoRewindIterator($this->parse());

while ($parsed->valid()) {
yield new LimitIterator($parsed, limit: self::BATCH_SIZE);
}
}

private function parse(): Generator
{
// ...
}
}
  • 👍 74
  • 🔥 35
  • 🤔 7
  • ✍ 6
  • 🥴 3
  • ❤ 1
  • 🌭 1
  • 🗿 1
More from @phpyh
  1. Sep 30, 2026🍺 BeerPHP AI Moscow Кажется, «неделя PHP» потихоньку превращается в месяц PHP. 😅 Будет 2…
  2. Sep 28, 2026Запустили Пыхник и неделю PHP! Залетайте на первый открытый доклад от Дмитрия Dantes про к…
  3. Sep 15, 2026Сейчас один человек с AI может выполнять работу целого IT-отдела. Только хуёво
  4. Sep 12, 2026Спасибо за заявки! Всем напишу в понедельник. Осталось 1 место.
  5. Sep 11, 2026Хардкорный курс асинхронного PHP https://hardcourse.ru/php/async
  6. Sep 11, 2026Ещё полчасика надо — сайт готов, расписываю программу! 🙏
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →