
# Datos en lote

Los métodos `*Many` aceptan matrices y devuelven los registros o identificadores creados; los métodos `*Stream` aceptan cualquier iterable, no guardan nada en memoria y devuelven un recuento. Use flujos para trabajos de ingesta cuyo origen supere el tamaño que desea para una matriz PHP. Los métodos masivos bloquean la colección una sola vez y, en el registro y la cola, almacenan en búfer muchos registros por fsync, lo que hace que sus escrituras masivas sean varias veces más rápidas por registro que las llamadas individuales. Las escrituras masivas de `DocStore` siguen sincronizando cada archivo de registro; reducen la frecuencia de bloqueos, no la de fsync.

API masivas de 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');
```

Las filas JSONL son un objeto por línea, ya sea `{"id": "...", "data": {...}}` o un objeto de datos sin envoltorio (se genera un ID al importar). Las filas pueden incluir identificadores explícitos, por lo que exportar e importar permite recuperar exactamente una colección.

API masivas de SegmentedLog:

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

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

API masivas de Queue:

```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));
```

Las particiones opcionales ubican los segmentos de un registro en un directorio por día o por mes (`events/partitions/2026-07-05/`), de modo que se pueden archivar o eliminar períodos completos como directorios:

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

La retención elimina los registros anteriores a una fecha límite y compacta el espacio recuperado; `purgeDone` elimina de la memoria los trabajos completados de la cola:

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