Parquet通常可将CSV文件压缩至1/3~1/5,节省70%–90%空间,因其列式存储、字典/RLE编码及页级Snappy/zstd压缩协同作用,尤其对低基数字符串和重复数值效果显著。

用 to_parquet 替代 to_csv 能省多少空间?
直接结论:通常能压到 CSV 的 1/3~1/5,且读写更快。CSV 是纯文本,重复字段名、类型信息、浮点数小数位全存;Parquet 是列式二进制格式,自带类型推断、字典编码和页级压缩(默认 snappy),尤其对重复值多、字符串分类明显的 DataFrame 效果突出。
实操建议:
-
to_parquet默认不保存索引,如需保留,加参数index=True - 字符串列若取值有限(如状态码、地区名),
to_parquet自动启用字典编码,比gzip压缩 CSV 更高效 - 避免对含大量唯一字符串(如 UUID、长日志)的列盲目使用 Parquet——字典编码反而膨胀,此时可先转为
category类型再存 - 示例:
df.to_parquet("data.parquet", compression="snappy")
什么时候该选 compression="zstd" 而不是默认 snappy?
snappy 快但压缩率一般;zstd 在速度和压缩率之间更平衡,尤其适合中等规模(千万行以内)、含较多数值或短字符串的 DataFrame。它对整数列的 delta 编码 + Huffman 压缩效果明显。
注意点:
立即学习“Python免费学习笔记(深入)”;
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 需额外安装:
pip install zstandard,否则to_parquet会报错ValueError: compression='zstd' not supported -
zstd级别可调(1–22),默认是 1;设为compression="zstd", compression_level=3可在不显著拖慢写入的前提下提升 10%~15% 压缩率 - 读取时无需指定压缩级别,Parquet 文件头已记录
用 to_pickle 压缩靠谱吗?
不推荐用于长期存储或跨 Python 版本共享。Pickle 是 Python 专属序列化协议,不同版本间可能不兼容;且即使加 compression="xz",压缩率也常不如 Parquet,读写还更慢。
仅适合临时场景:
- 同一台机器、相同 Python 环境下的中间结果缓存
- 数据含不可序列化的对象(如 lambda、某些自定义类),Parquet 会直接报错,此时
to_pickle是无奈之选 - 若真要用,务必限定协议版本:
df.to_pickle("tmp.pkl", compression="xz", protocol=4)(protocol=4兼容 Python 3.4+)
列类型没优化,压缩就是白忙活
Parquet 和 Pickle 都依赖底层数据类型。一个 object 列存整数,会当字符串存,压缩率暴跌;int64 存小范围 ID,浪费 4 倍空间。
动手前必须检查并收缩类型:
- 数值列用
pd.to_numeric(..., downcast="integer")或astype("uint8") - 字符串列若唯一值 astype("category")
- 时间列别用
object,统一转pd.to_datetime() - 检查命令:
df.dtypes
和df.memory_usage(deep=True).sum()
,改完应有 30%+ 内存下降
压缩不是魔法,类型不对,再好的压缩算法也救不了磁盘空间。

















