当前位置: 首页 > news >正文

工业界实战之数据存储格式与精度

数据存储

🔹 常见存储格式与精度

  1. 不会损失精度:二进制存储(npy, npz, pickle, HDF5, Feather, Arrow, Parquet 等)。

  2. 可能损失精度:文本格式存储(csv, json, txt),取决于导出时保留的小数位数。

  3. 必然损失精度:强制数据类型降级(float64 存成 float32/float16 等)。

不会有精度损失的情况

  1. 二进制格式存储(精确保留底层内存表示)

    • .npy / .npz(NumPy 格式)

    • .pkl(Python pickle)

    • HDF5(h5/hdf5,如果使用 float32/float64 存储)

    • Feather / Arrow 格式

    • Parquet(数值类型不做额外转换时)

    👉 原因:这些格式会直接存储数据的二进制表示(比如 float64 的 IEEE 754 表示),只要读写时保持相同的数据类型,就不会有额外的精度损失。

可能有精度损失的情况 

  1. 文本格式存储(需要数值 ↔ 字符串 转换)

    • .csv / .tsv / .txt

    • JSON (.json)

    • XML

    • YAML

    👉 原因:

    • 浮点数在写出时会被转成字符串(小数点后的位数有限,比如默认 6 位/15 位),再读入时再转回浮点数,可能丢失部分精度。

    • 如果手动设置高精度输出(如 np.savetxt(..., fmt="%.18e")),损失可以忽略,但文件会更大。

    • 在使用map reduce时候,json不是一种特别好的保存方式

一定会有精度损失的情况

强制类型降级

  • float64 → float32 → float16

  • int64 → int32 → int16

👉 无论什么存储格式,只要数据类型被降级,就会损失精度(小数位或数值范围)。
比如:np.float64(0.1234567890123456) 存成 float32 就会截断成 0.12345679


二进制存储 vs 文本存储

  1. 二进制存储(比如 .npy、HDF5)
    直接把这串字节(01000000 01001000 …)写到文件里,读出来完全一样,不丢精度。3.14 存进去后实际上是:01000000 01001000 11110101 11000011 这就是它的 二进制表示

  2. 文本存储(比如 .csv.json
    会把 3.14 转成字符串 "3.14",然后存入文件。
    下次再读的时候,需要解析字符串 "3.14" → 转成浮点数 → 重新编码成二进制。
    如果存的时候截断了,比如 "3.140000",那读回来就不一定等于原值。

🔹 总结  📌 “存储二进制表示” = 把数据在内存里的 0/1 编码(字节序列) 原封不动写到文件里,而不是转成人能看的字符串。

🔹 存储时间/读取时间/存储空间

【数据面试滑铁卢】Python数据常用存储格式(纯效率比对展示)_哔哩哔哩_bilibili


行存储和列存储

  • 按行处理多 → 选择行连续存储
  • 按列分析多 → 选择列连续存储
  • 深度学习通常选择行连续:符合批量处理模式
  • 注意框架默认:NumPy/PyTorch默认行连续,需要时进行转换

Pandas DataFrame默认使用行连续存储  不管源文件是什么格式,转换为DataFrame后通常是行连续的

Apache Arrow (Feather格式的底层) /Parquet 使用列连续存储

csv/json是行存储

🔹 实际工程考虑

一般用feather/parquet/pickle都比较多 兼顾效率和精度

yaml格式用来存超参数 更有可读性

虽然理论上float64精度最高,但在实践中:

  • float32通常已足够:大多数深度学习框架默认使用float32
  • 存储空间平衡:float64占用双倍空间
  • 计算效率:GPU对float32优化更好

精度

1. float32 (单精度浮点数,FP32)

这是最常用的浮点数表示方式,符合 IEEE 754 标准

  • 总位数:32 位

  • 组成

    • 1 位符号位 (sign)

    • 8 位指数位 (exponent)

    • 23 位尾数位 (mantissa / significand)

  • 优点:范围大、精度高,广泛用于数值计算、科学计算、传统训练。

  • 缺点:存储和计算开销大,速度相对慢。


2. float16 (半精度浮点数,FP16)

为减少存储和加速计算而出现。

  • 总位数:16 位

  • 组成

    • 1 位符号位

    • 5 位指数位

    • 10 位尾数位

  • 优点

    • 占用显存减少一半(相比 FP32)

    • 运算速度快(尤其在 GPU 的 Tensor Core 上)

  • 缺点

    • 范围和精度小于 FP32,容易出现溢出 (overflow) 或下溢 (underflow)

    • 对数值稳定性要求较高(训练时常用 混合精度训练:权重 FP32 存,计算用 FP16)


3. float8 (超低精度浮点数,FP8)

这是最新兴的格式,主要用于 大模型训练 / 推理加速,NVIDIA Hopper 架构 (H100) 已支持。

  • 总位数:8 位

  • 常见标准

    • E4M3:4 位指数 + 3 位尾数

    • E5M2:5 位指数 + 2 位尾数

  • 优点

    • 存储量仅 FP32 的 1/4,带宽和显存占用大幅下降

    • 硬件上加速非常明显(矩阵乘法吞吐率翻倍)

  • 缺点

    • 精度更低,表示范围有限

    • 必须依赖缩放因子 (scaling factor) 等技巧来保持数值稳定性


4. 三者之间的关系

  • FP32 → 精度最高,开销最大,用作“基准”。

  • FP16 → 精度折中,显存/速度提升 2 倍,常用于混合精度训练。

  • FP8 → 精度最低,但速度与存储优势最大,用于大模型分布式训练/推理。

常见用法是 分层混合精度

  • 训练中:权重和梯度可能保留 FP16/FP32,而激活值和部分计算用 FP8。

  • 推理中:大部分用 FP8,关键部分用 FP16/FP32 保证准确度。

http://www.xdnf.cn/news/1427815.html

相关文章:

  • MySQL 事务隔离与 MVCC
  • MySQL事务+MVCC(精简版,包教包废)
  • 【彻底搞懂Java垃圾回收机制(附调优参数)】
  • 从电脑底层到进程创建:一篇看懂冯诺依曼、OS和进程
  • 【Qt开发】按钮类控件(二)-> QRadioButton
  • 【译】更好地控制您的 Copilot 代码建议
  • ResponseBodyEmitter介绍
  • Linux IPv4路由子系统深度解析
  • 什么是Token?——理解自然语言处理中的基本单位
  • 基于单片机颜色识别分拣系统设计
  • AI 生成视频入门:用 Pika Labs+Runway ML 制作短内容
  • 4.MySQL数据类型
  • day42-单片机
  • 【Linux基础知识系列:第一百一十六篇】使用mt进行磁带驱动管理
  • 第三家公司虽然用了powerbi,但更适合用excel
  • Flutter环境搭建全攻略之-windows环境搭建
  • 奔赴MOBILITY China 2026深圳新能源汽车技术展,共鉴行业高光时刻
  • 从零开始在Ubuntu上快速部署Docker和Dify:结合 Dify + 蓝耘 MaaS平台打造 AI 应用实战指南
  • Web基础学习笔记01
  • 计算机视觉与深度学习 | 视觉里程计技术全解析:定义、原理、与SLAM的关系及应用场景
  • Spring Boot 日志框架选择指南:Logback vs Log4j2
  • 破解能源密码——人造太阳:可控核聚变技术进展
  • 光储充一体化智慧能源平台助力某能投公司绿色能源转型
  • 【面试场景题】如何理解设计模式
  • 为什么研发文档的变更缺乏审批和追溯
  • 多通道电生理信号同步记录采集系统测试总结
  • 用好AI,从提示词工程到上下文工程
  • Linux系统强大的命令行工具之fuser
  • Vue + fetchEventSource 使用 AbortController 遇到的“只能中止一次”问题解析与解决方案
  • 详解 C++ 中的虚析构函数