【diffusers 进阶(十五)】dataset 工具,Parquet和Arrow 数据文件格式,load dataset 方法

发布于:2025-04-04 ⋅ 阅读:(29) ⋅ 点赞:(0)

系列文章目录


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


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")

总结:

  1. 文件格式特点:
  • Parquet:磁盘列式存储,适合大规模数据存储和高效查询
  • Arrow:内存列式存储,适合快速内存处理(需注意内存容量限制)
  1. 加载方式:
  • 本地文件:指定data_files参数(支持多文件拆分)
  • 远程文件:直接传入HTTP/HTTPS URL
  • 通用接口:统一使用datasets.load_dataset(),通过格式参数区分
  1. 应用场景:
  • Parquet:数据仓库、离线分析、大规模数据存储
  • Arrow:内存计算、实时处理、跨进程数据传递
  1. 技术优势:
  • 列式存储:提升分析查询效率,降低I/O开销
  • 压缩优化:Parquet支持多种压缩算法
  • 类型保留:保持原始数据类型(如日期、嵌套结构)
  • 元数据管理:自动读取文件元信息

二者详细对比

以下是Parquet和Arrow两种数据格式的详细对比分析:

1.核心特性对比

特性 Parquet Arrow
存储介质 磁盘存储(适合持久化存储) 内存存储(适合内存计算与跨进程传输)
存储结构 列式存储,支持分块与压缩 列式存储,内存友好型二进制格式
压缩方式 支持Snappy、Gzip、Brotli等压缩算法 不压缩(需结合Parquet或其他压缩层)
数据类型 支持复杂类型(嵌套结构、日期等) 支持更广泛的数据类型(如字典、列表等)
元数据管理 自动记录统计信息(如最小值、最大值) 包含完整的Schema定义和内存布局信息

2.应用场景差异

Parquet:

  1. 离线分析:适合数据仓库、日志分析等需要频繁查询特定列的场景。
  2. 大规模数据存储:通过列式压缩减少存储空间,支持高效的查询过滤。
  3. 跨平台兼容性:与Spark、Pandas等工具深度集成,便于多框架处理。

Arrow:

  1. 内存计算:在内存密集型任务(如机器学习预处理)中提供快速访问。
  2. 实时处理:支持零拷贝数据传输,适合微服务间高效通信。
  3. 跨语言支持:通过Arrow Flight协议实现不同语言间的数据共享。

3.性能对比

场景 Parquet Arrow
磁盘读取 高(列式存储减少I/O量) 不适用(需配合Parquet)
内存访问 低(需加载到内存后处理) 极高(直接内存访问)
压缩效率 高(可选压缩算法) 无(需结合其他格式)
序列化速度 较慢(需解析文件结构) 极快(内存直接序列化)

4. Hugging Face生态中的使用

  1. 分布式加载
    # Parquet分布式分片
    dataset = load_dataset("parquet", data_files="s3://bucket/*.parquet", split="train")
    
    # Arrow内存共享
    dataset = load_dataset("arrow", data_files="local/*.arrow", split="train")
    
  2. 类型保留
    • Parquet:自动推断日期、嵌套结构等复杂类型。
    • Arrow:精确保留原始数据类型(如Python的datetime对象)。
  3. 性能优化
    • 使用dataset.set_format("arrow")将数据转为Arrow格式以加速内存操作。

5. 选择建议

  • 选Parquet:当需要持久化存储、跨工具协作或处理PB级数据时。
  • 选Arrow:当需要内存快速处理、实时分析或跨语言数据传递时。
  • 组合使用:将数据存储为Parquet,加载到内存后转为Arrow格式进行计算。

网站公告

今日签到

点亮在社区的每一天
去签到