# Summary
# Cues
# Notes
下面这句话的本意是:
> **在最后“写盘”这一步,不要自己手撸 `open()/write()` 或乱拼文件名,而是把清洗‑去重后的数据流交给 DataTrove 或 NeMo Curator 里的 Writer/DocumentDataset 来“保存”成分片的 JSONL/Parquet 数据集。**
---
## 为什么要用专用库来“保存”?
* **自动分片**:给定目标大小(常见 256 MB~1 GB),库会把数据均匀切成 shard,例如 `web_00000.jsonl.zst`、`web_00001.jsonl.zst`。
* **并发安全**:多进程 / 集群同时写时,库会用占位符或模板(`${rank}`)避免文件覆写冲突。
* **压缩与远程存储**:内置 gzip、zstd 以及 fsspec 适配的 S3/GCS/OSS 路径,写完直接在对象存储里就绪。
* **元数据一致性**:Writer 会把每条记录的 `id、lang、domain…` 一并写入,方便后续训练或统计。
---
## DataTrove 的做法
```python
from datatrove.pipeline import Pipeline
from datatrove.readers import WetReader
from datatrove.writers import JsonlWriter, ParquetWriter
from datatrove.filters import FastTextLangFilter, LengthFilter
from datatrove.executors import LocalPipelineExecutor
pipeline = Pipeline(
WetReader("commoncrawl/2024-26/*.wet.gz"),
FastTextLangFilter(keep_langs=["en"]),
LengthFilter(min_chars=200),
# ⬇️ 最终保存:每个 shard ≈256 MB、zstd 压缩
JsonlWriter(
"cc_en_clean/",
shardsize=256 << 20,
compression="zstd",
output_filename="cc_en_${rank}.jsonl.zst"
)
)
LocalPipelineExecutor(num_tasks=16).run(pipeline)
```
DataTrove 把保存这一环抽象成 **Writer** 模块;官方文档在 *“Saving data”* 部分强调了用 Writer 写 JSONL/Parquet 而不是自己保存 citeturn7view0L74-L76。
---
## NeMo Curator 的做法
```python
import nemo_curator as nc
from nemo_curator.datasets import DocumentDataset
ds = (DocumentDataset
.read_wet("commoncrawl/2024-26/*.wet.gz")
.filter(nc.FasttextLangFilter("en"))
.filter(nc.LengthFilter(min_chars=200))
.dedup(nc.SemanticDedup(threshold=0.88)))
# ⬇️ 保存为分片 Parquet;支持本地或 S3
ds.to_parquet("cc_en_clean/", shardsize="256MB", compression="zstd")
```
NeMo Curator 用 `DocumentDataset.to_json()` / `to_parquet()` 一行完成写盘;其官方文档说明 `DocumentDataset` **“supports reading and writing to sharded jsonl and parquet files…本地或 S3”** citeturn11view0L25-L27。
---
## 放到 CS336 Lab4 管线里怎么用?
1. **Extract → Filter → Dedup** 之后,把文档流交给 DataTrove Writer 或 NeMo Curator `to_*()`。
2. 指定 `shardsize` 和 `compression`,输出目录就是你在交作业脚本里要填的 `$DATA_DIR`。
3. 评分脚本会用固定 tokenizer 逐个 shard 读入训练小模型,因此分片命名需稳定(示例用 `cc_en_${rank}.jsonl.zst`)。
---
## 选择建议
| 场景 | 推荐 |
| --- | --- |
| **CPU/GPU 都可、需要快速上手** | **DataTrove**:API 简单、依赖少,Ray/Slurm/本地都能跑。|
| **有多张 GPU、已装 RAPIDS/Dask、想全流程 GPU 加速** | **NeMo Curator**:Filter、PCA PII 检测、去重都能走 GPU,省时。|
| **需要和 NVIDIA Megatron/NIM 生态整合** | NeMo Curator 更顺手(同家族)。|
> 简单记住:**DataTrove = Hugging Face 流式 Writer;NeMo Curator = NVIDIA GPU‑加速 Writer。**
> 在 Lab4 把“保存”这步交给它们,就能省掉不少并发、命名、分片的坑。祝你跑分愉快!