
# Joukkodata

`*Many`-menetelmät ottavat taulukoita ja palauttavat luodut tietueet tai tunnisteet; `*Stream`-menetelmät ottavat minkä tahansa iteroitavan arvon, eivät säilytä mitään muistissa ja palauttavat lukumäärän. Käytä virtoja syöttötöissä, joissa syöte on suurempi kuin haluat PHP-taulukon olevan. Joukkomenetelmät lukitsevat kokoelman kerran ja puskuroivat lokissa ja jonossa useita tietueita kutakin fsync-operaatiota kohti, mikä tekee niiden joukkokirjoituksista useita kertoja nopeampia tietuetta kohti kuin yksittäisistä kutsuista. `DocStore`-joukkokirjoitukset synkronoivat silti jokaisen tietuetiedoston; ne vähentävät lukituksen vaihtelua, eivät fsync-operaatioita.

DocStoren joukkorajapinnat:

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

JSONL-rivit ovat yksi objekti riviä kohti, joko muodossa `{"id": "...", "data": {...}}` tai paljaana dataobjektina (tuonnissa luodaan tunniste). Riveillä voi olla nimenomaiset tunnisteet, joten kokoelman vienti ja tuonti säilyttää sen täsmälleen.

SegmentedLogin joukkorajapinnat:

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

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

Queuen joukkorajapinnat:

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

Valinnaiset osiot sijoittavat lokin segmentit päivä- tai kuukausikohtaiseen hakemistoon (`events/partitions/2026-07-05/`), jolloin vanhat jaksot voidaan arkistoida tai poistaa kokonaisina hakemistoina:

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

Säilytyskäytäntö poistaa katkaisupäivää vanhemmat lokitietueet ja tiivistää vapautuneen tilan; `purgeDone` poistaa valmiit jonotyöt muistista:

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