
# Dados em lote

Os métodos `*Many` recebem arrays e retornam os registros ou IDs criados; os métodos
`*Stream` recebem qualquer iterável, não mantêm nada na memória e retornam uma
contagem. Use fluxos para trabalhos de ingestão cuja entrada seja maior do que o array PHP que você deseja manter. Os métodos em lote bloqueiam a coleção uma vez e, no log
e na fila, armazenam muitos registros em buffer por fsync, tornando as gravações em lote
várias vezes mais rápidas por registro do que as chamadas individuais. As gravações em lote `DocStore`
ainda sincronizam cada arquivo de registro; elas reduzem a contenção do bloqueio, não os fsyncs.

APIs em lote do DocStore:

```php
$records = $docs->putMany([
    ['slug' => 'home', 'kind' => 'page'],
    ['slug' => 'about', 'kind' => 'page'],
]);

$count = $docs->putStream($largeIterable);

$docs->exportJsonl(__DIR__ . '/pages.jsonl');
$docs->importJsonl(__DIR__ . '/pages.jsonl');
```

As linhas JSONL são um objeto por linha, seja `{"id": "...", "data": {...}}` ou
um objeto de dados simples (um ID é gerado durante a importação). As linhas podem conter
IDs explícitos, permitindo que a exportação e a importação façam uma ida e volta exata da coleção.

APIs em lote do SegmentedLog:

```php
$log->appendMany([
    ['type' => 'page.saved'],
    ['type' => 'page.rendered'],
]);

$log->appendStream($largeIterable);
```

APIs em lote da fila:

```php
$queue->enqueueMany([
    ['task' => 'render', 'pageId' => $home->id()],
    ['task' => 'notify', 'pageId' => $home->id()],
]);

$jobs = $queue->claimMany(100);
$queue->completeMany(array_map(fn ($job) => $job->id(), $jobs));
```

Partições opcionais armazenam os segmentos de um log em um diretório por dia ou por mês
(`events/partitions/2026-07-05/`), para que períodos antigos possam ser arquivados
ou excluídos como diretórios inteiros:

```php
$daily = new Storh\SegmentedLog($root, 'events', partition: 'daily');
$monthly = new Storh\SegmentedLog($root, 'events', partition: 'monthly');
```

A retenção exclui registros do log anteriores a uma data limite e compacta o espaço recuperado; `purgeDone` remove da memória as tarefas concluídas da fila:

```php
$deleted = $log->retain()->olderThanDays(90)->compact();
$queue->purgeDone(olderThanSeconds: 86400);
```
