系列文章目录
- 【diffusers 极速入门(一)】pipeline 实际调用的是什么? call 方法!
- 【diffusers 极速入门(二)】如何得到扩散去噪的中间结果?Pipeline callbacks 管道回调函数
- 【diffusers极速入门(三)】生成的图像尺寸与 UNet 和 VAE 之间的关系
- 【diffusers极速入门(四)】EMA 操作是什么?
- 【diffusers极速入门(五)】扩散模型中的 Scheduler(noise_scheduler)的作用是什么?
- 【diffusers极速入门(六)】缓存梯度和自动放缩学习率以及代码详解
- 【diffusers极速入门(七)】Classifier-Free Guidance (CFG)直观理解以及对应代码
- 【diffusers极速入门(八)】GPU 显存节省(减少内存使用)技巧总结
- 【diffusers极速入门(九)】GPU 显存节省(减少内存使用)代码总结
- 【diffusers极速入门(十)】Flux-pipe 推理,完美利用任何显存大小,GPU显存节省终极方案(附代码)
- 【diffusers 进阶(十一)】Lora 具体是怎么加入模型的(推理代码篇上)OminiControl
- 【diffusers 进阶(十二)】Lora 具体是怎么加入模型的(推理代码篇下)OminiControl
- 【diffusers 进阶(十三)】AdaLayerNormZero 与 AdaLayerNormZeroSingle 代码详细分析
- 【diffusers 进阶(十四)】权重读取,查看 Lora 具体加在哪里和 Rank ‘秩’ 是多少?以 OminiControl 为例
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 系列文章目录
- load_dataset
- Parquet
- Arrow
- 二者详细对比
- 1.核心特性对比
- 2.应用场景差异
- 3.性能对比
- 4. Hugging Face生态中的使用
- 5. 选择建议
load_dataset
Parquet
Parquet文件采用列式存储格式,与CSV等行式文件不同。由于效率更高且查询响应更快,大型数据集通常存储为Parquet格式。
加载Parquet文件:
from datasets import load_dataset
dataset = load_dataset("parquet", data_files={'train': 'train.parquet', 'test': 'test.parquet'})
通过HTTP加载远程Parquet文件:
base_url = "https://huggingface.co/datasets/wikimedia/wikipedia/resolve/main/20231101.ab/"
data_files = {"train": base_url + "train-00000-of-00001.parquet"}
wiki = load_dataset("parquet", data_files=data_files, split="train")
Arrow
Arrow文件采用内存列式存储格式,与CSV等行式格式和未压缩的Parquet格式不同。
加载Arrow文件:
from datasets import load_dataset
dataset = load_dataset("arrow", data_files={'train': 'train.arrow', 'test': 'test.arrow'})
通过HTTP加载远程Arrow文件:
base_url = "https://huggingface.co/datasets/croissantllm/croissant_dataset/resolve/main/english_660B_11/"
data_files = {"train": base_url + "train/data-00000-of-00080.arrow"}
wiki = load_dataset("arrow", data_files=data_files, split="train")
总结:
- 文件格式特点:
- Parquet:磁盘列式存储,适合大规模数据存储和高效查询
- Arrow:内存列式存储,适合快速内存处理(需注意内存容量限制)
- 加载方式:
- 本地文件:指定data_files参数(支持多文件拆分)
- 远程文件:直接传入HTTP/HTTPS URL
- 通用接口:统一使用datasets.load_dataset(),通过格式参数区分
- 应用场景:
- Parquet:数据仓库、离线分析、大规模数据存储
- Arrow:内存计算、实时处理、跨进程数据传递
- 技术优势:
- 列式存储:提升分析查询效率,降低I/O开销
- 压缩优化:Parquet支持多种压缩算法
- 类型保留:保持原始数据类型(如日期、嵌套结构)
- 元数据管理:自动读取文件元信息
二者详细对比
以下是Parquet和Arrow两种数据格式的详细对比分析:
1.核心特性对比
特性 | Parquet | Arrow |
---|---|---|
存储介质 | 磁盘存储(适合持久化存储) | 内存存储(适合内存计算与跨进程传输) |
存储结构 | 列式存储,支持分块与压缩 | 列式存储,内存友好型二进制格式 |
压缩方式 | 支持Snappy、Gzip、Brotli等压缩算法 | 不压缩(需结合Parquet或其他压缩层) |
数据类型 | 支持复杂类型(嵌套结构、日期等) | 支持更广泛的数据类型(如字典、列表等) |
元数据管理 | 自动记录统计信息(如最小值、最大值) | 包含完整的Schema定义和内存布局信息 |
2.应用场景差异
Parquet:
- 离线分析:适合数据仓库、日志分析等需要频繁查询特定列的场景。
- 大规模数据存储:通过列式压缩减少存储空间,支持高效的查询过滤。
- 跨平台兼容性:与Spark、Pandas等工具深度集成,便于多框架处理。
Arrow:
- 内存计算:在内存密集型任务(如机器学习预处理)中提供快速访问。
- 实时处理:支持零拷贝数据传输,适合微服务间高效通信。
- 跨语言支持:通过Arrow Flight协议实现不同语言间的数据共享。
3.性能对比
场景 | Parquet | Arrow |
---|---|---|
磁盘读取 | 高(列式存储减少I/O量) | 不适用(需配合Parquet) |
内存访问 | 低(需加载到内存后处理) | 极高(直接内存访问) |
压缩效率 | 高(可选压缩算法) | 无(需结合其他格式) |
序列化速度 | 较慢(需解析文件结构) | 极快(内存直接序列化) |
4. Hugging Face生态中的使用
- 分布式加载:
# Parquet分布式分片 dataset = load_dataset("parquet", data_files="s3://bucket/*.parquet", split="train")# Arrow内存共享 dataset = load_dataset("arrow", data_files="local/*.arrow", split="train")
- 类型保留:
- Parquet:自动推断日期、嵌套结构等复杂类型。
- Arrow:精确保留原始数据类型(如Python的datetime对象)。
- 性能优化:
- 使用
dataset.set_format("arrow")
将数据转为Arrow格式以加速内存操作。
- 使用
5. 选择建议
- 选Parquet:当需要持久化存储、跨工具协作或处理PB级数据时。
- 选Arrow:当需要内存快速处理、实时分析或跨语言数据传递时。
- 组合使用:将数据存储为Parquet,加载到内存后转为Arrow格式进行计算。