当前位置:首页 > 文章列表 > 科技周边 > 人工智能 > Datasets streaming 怎样流式读取大数据集

Datasets streaming 怎样流式读取大数据集

来源:17golang原创 2026-10-25 12:07:41 0浏览 收藏

Hugging Face Datasets 读取大数据集时,在 load_dataset 中传入 streaming=True,再用 for 或 take 消费返回的 IterableDataset。这样无需先把整个数据集转换并加载成可随机访问的表;但后续若调用 list(stream) 收集全部样本,仍然可能耗尽内存。

官方地址:https://huggingface.co/docs/datasets/

先把读取任务拆成加载与消费

“先看几条是否可用”和“把全部文本交给训练任务”应使用不同的消费上限。前者限定预览数量、截断长文本并显示空结果;后者逐条处理,避免在应用层保留完整历史。流式对象提供迭代能力,不代表数据已经全部读取成功。

本文用自己准备的 JSONL 分片说明,文件放在 data 目录,命名如 articles-part-a.jsonl,每行是一个带 text 字符串字段的独立对象。代码为未执行的教学示例,未给出虚构下载速度、内存曲线或运行输出。远端数据集也可采用同样的 streaming 参数,但仓库名称、配置、split 和访问授权须按其数据集卡填写。

用 JSONL 文件建立流式读取组件

下面把文件选择、流对象和预览函数分开。load_dataset 的 json 构建器接收 data_files,train 表示本例的分片名;split="train" 取出单个可迭代对象。创建成功后,真正的文件内容与字段问题仍可能在迭代阶段暴露,因此异常处理要包住消费部分。

from datasets import load_dataset

# 使用你自己的 JSONL 分片;每行一个对象,并含有 text 字段
source_files = {"train": "data/articles-*.jsonl"}
stream = load_dataset(
    "json",
    data_files=source_files,
    split="train",
    streaming=True,  # 创建可迭代数据集,读取发生在消费样本时
)


def preview_text(dataset, limit=5):
    # 只保留受限预览,不将整个流转成列表
    rows = []
    for row in dataset.take(limit):
        text = row.get("text")
        if not isinstance(text, str):
            raise ValueError("样本的 text 字段必须是字符串")
        rows.append(text[:120].replace("\n", " "))
    return rows


try:
    preview = preview_text(stream)
    if not preview:
        print("没有可预览的记录")
    for position, snippet in enumerate(preview, start=1):
        # 序号与文本共同输出,便于识别记录,不只依靠颜色状态
        print(f"记录 {position}: {snippet}")
except Exception as exc:
    # 入口示例统一报告失败;批处理服务应记录异常类型并交给调用方处理
    raise RuntimeError("读取预览失败,请检查文件、格式与字段") from exc
流式读取结构图:JSONL分片、加载配置与IterableDataset的静态依赖
图1:静态结构图。左侧是源文件,中间是加载配置,右侧是可迭代对象;连线表示依赖,不代表运行顺序或真实结果。

图中的 JSONL分片、data_files、split、streaming=True、load_dataset 与 IterableDataset 分属源文件、加载配置、迭代对象三个边界。data_files 指定文件,split 选择分片,streaming=True 选择读取模式,load_dataset 据此创建 IterableDataset。

只预览少量样本并给出明确状态

preview_text 限定最多读取5条,并把每条预览截成120个字符。这个小列表保存的是展示内容,而不是把全部数据留在内存中。若只想持续处理记录,可以直接在 for 循环里调用业务函数,处理完当前记录就交给下一条。

给数据预览工具接界面时,应区分“尚未读取”“读取中”“没有记录”和“读取失败”。错误提示要保留可定位的字段或文件信息,同时避免把令牌写入页面。状态应有可读文字,样本应有记录序号,不让读者仅凭红绿颜色判断成败;长文本截断后也应说明截断发生在展示层。

take(5) 是有界查看,不等于随机抽样。原始文件前几条可能来自同一个来源,因此不能仅凭这个预览断言整个数据集的分布、质量或类别比例符合训练要求。

用缓冲区控制打乱与内存开销

需要让预览不总是从文件开头取样时,可以先 shuffle 再 take。流式 shuffle 使用有限缓冲区,buffer_size 的单位是样本数量,并非字节。下面的512只是教学起点,不是适用于所有机器的推荐值。

# stream 来自上一个例子;先打乱,再限定预览条数
mixed = stream.shuffle(seed=73, buffer_size=512)
for row in mixed.take(8):
    # 逐条使用,避免 list(mixed) 累积全部记录
    text = row.get("text", "")
    if not isinstance(text, str):
        continue  # 此处明确跳过异常字段;实际业务可改为记录或报错
    print(text[:80])
消费预算结构图:shuffle缓冲区、take上限与预览文本的关系
图2:静态结构图。区分样本缓冲预算与展示预算;没有表示实测内存占用或全局随机性。

IterableDataset、shuffle、buffer_size、seed、take 与预览文本组成图中的六个节点。IterableDataset 是 shuffle 的来源,buffer_size 配置缓冲容量,seed 配置随机种子,take 约束预览条数,预览文本绑定有限的展示结果。这些限制控制不同层面的资源,不能互相替代。

缓冲区越大,可能保留的样本越多;单条文本的体积、解码后的对象和下游批大小也会影响内存。固定 seed 便于在相同输入与设置下复查抽样,不能让变化的远端数据自动保持一致。有限缓冲打乱也不等于对全体记录进行完整随机排列。

空数据、坏字段和随机访问怎样处理

现象或需求原因或限制处理方式
创建对象后读取才报错内容读取是惰性的在实际迭代处处理异常
内存仍持续增长应用可能累积样本或缓冲过大检查列表、缓存和批大小
text字段不是字符串输入与消费函数约定不一致选择报错、转换或跳过并记录
想直接取第百万条IterableDataset不适合按行随机访问评估普通Dataset及索引需求

streaming=True 是否完全不下载任何内容?不是。远端迭代仍需传输数据、读取元数据或进行预读;它主要避免先完成整个数据文件的下载与表转换,不能承诺零网络、零缓存或固定内存。

本地流式文件需要联网吗?本例的数据来自自己的本地 JSONL 文件,源文件本身不需要从 Hub 获取。安装依赖、远端数据源和认证是另外的事项,不能从“使用本地路径”推导所有环境都绝对离线。

可以把大 JSON 数组直接当 JSONL 吗?不可以。JSONL 是逐行独立对象。格式与压缩方式会影响流式支持,有些 JSON 文件可能需要整体读取;选择格式时要查构建器说明,而不是只改文件扩展名。

开始接训练前,先让有限预览明确显示可读字段,再逐步接入消费函数与错误记录。保留清晰的记录上限和缓冲预算,才能避免在展示或处理层重新把大数据集全部攒进内存。

流式使用文档:https://huggingface.co/docs/datasets/stream

对象差异文档:https://huggingface.co/docs/datasets/about_mapstyle_vs_iterable

加载参数文档:https://huggingface.co/docs/datasets/package_reference/loading_methods

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Moderation 怎样组合多类别判断Moderation 怎样组合多类别判断
上一篇
Moderation 怎样组合多类别判断
PyTorch Profiler 怎么导出可分享的 Chrome trace
下一篇
PyTorch Profiler 怎么导出可分享的 Chrome trace
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    685次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    699次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    753次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    717次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    552次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码