
# 一括データ

`*Many`メソッドは配列を受け取り、作成されたレコードまたはIDを返します。`*Stream`メソッドは任意の反復可能オブジェクトを受け取り、メモリを保持せずに件数を返します。入力がPHP配列に収まらない取り込みジョブでは、ストリームを使ってください。一括メソッドはコレクションのロックを一度だけ取得し、ログとキューでは1回のfsyncで多くのレコードをまとめて書き込むため、1件ずつ呼び出すよりレコードあたりの一括書き込みが数倍速くなります。`DocStore`の一括書き込みではレコードファイルごとに同期します。削減するのはロックの頻繁な取得であり、fsyncの回数ではありません。

DocStoreの一括API：

```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の行は1行につき1オブジェクトで、`{"id": "...", "data": {...}}`またはデータオブジェクト単体です（インポート時にIDが生成されます）。行には明示的なIDを含められるため、エクスポートとインポートでコレクションを完全に往復できます。

SegmentedLogの一括API：

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

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

Queueの一括API：

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

任意のパーティション分割を指定すると、ログのセグメントが日別または月別のディレクトリ（`events/partitions/2026-07-05/`）に配置され、古い期間をディレクトリ単位でアーカイブまたは削除できます。

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

保持処理では、指定時点より古いログレコードを削除し、回収した領域を圧縮します。`purgeDone`は完了済みキュージョブをメモリから削除します。

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