
# Dane zbiorcze

Metody `*Many` przyjmują tablice i zwracają utworzone rekordy lub identyfikatory; metody `*Stream` przyjmują dowolny iterable, nie przechowują niczego w pamięci i zwracają liczbę. Używaj strumieni przy zadaniach pobierania danych, gdy wejście jest większe niż tablica PHP, którą chcesz trzymać w pamięci. Metody zbiorcze blokują kolekcję tylko raz, a w logu i kolejce buforują wiele rekordów na jedno fsync, dzięki czemu ich zapisy zbiorcze są kilka razy szybsze w przeliczeniu na rekord niż wywołania pojedyncze. Zapisy zbiorcze `DocStore` nadal synchronizują każdy plik rekordu; ograniczają częste blokowanie, a nie liczbę fsync.

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

Wiersze JSONL to jeden obiekt w każdym wierszu: albo `{"id": "...", "data": {...}}`, albo zwykły obiekt danych (podczas importu generowany jest identyfikator). Wiersze mogą zawierać jawne identyfikatory, więc eksport i import odtwarzają kolekcję dokładnie.

Zbiorcze API SegmentedLog:

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

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

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

Opcjonalne partycje umieszczają segmenty logu w katalogu dla danego dnia lub miesiąca (`events/partitions/2026-07-05/`), dzięki czemu starsze okresy można archiwizować lub usuwać jako całe katalogi:

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

Retencja usuwa rekordy logu starsze niż wskazany próg i kompaktuje odzyskane miejsce; `purgeDone` usuwa z pamięci ukończone zadania kolejki:

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