
# 批量数据

`*Many` 方法接受数组，并返回创建的记录或 ID；`*Stream` 方法接受任意可迭代对象，不会将数据保留在内存中，并返回数量。对于输入数据量超出你愿意存入内存的 PHP 数组大小的导入任务，请使用流。批量方法只获取一次集合锁，并且在日志和队列中会在每次 fsync 前缓冲多条记录，因此与逐条调用相比，批量写入的单条记录处理速度快数倍。`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 行每行一个对象，格式可以是 `{"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);
```
