启用Polars全局字符串缓存为何使Parquet文件体积减半?
是的,启用polars.enable_string_cache()确实是导致Parquet文件体积减半的原因,核心逻辑和Polars对Categorical类型的编码机制、字符串缓存的作用直接相关,具体如下:
Categorical字典的复用优化
Polars的全局字符串缓存会持久化字符串到整数的映射关系。启用缓存后,那些预先标记为Categorical的列(尤其是可选值极少的列),在每日任务的数据处理流程中会复用缓存里已有的字典,而非每次运行都生成全新的独立字典。
未启用缓存时,即便每日拉取的可选值完全一致,Polars也会为每个新生成的DataFrame创建单独的Categorical字典,这些重复的字典元数据会被写入Parquet文件,额外占用存储空间。启用缓存后,字典被复用,Parquet仅需存储紧凑的编码数据,无需重复写入冗余的字典信息,直接压缩了文件体积。关联操作中的类型协同优化
启用字符串缓存的核心目的是加速DataFrame关联(join)操作——缓存字符串的哈希值与映射关系,避免重复计算。在关联过程中,Polars会自动利用缓存对参与关联的列进行更高效的Categorical编码(即便未显式标记)。如果你的关联操作涉及已设为Categorical的列,缓存会确保这些列的编码始终保持一致且紧凑,最终写入Parquet时的编码效率大幅提升,进一步缩小了文件体积。数据完整性不受影响的原因
你验证行数和数据正常是合理的:字符串缓存仅优化了字符串的编码与映射流程,不会修改原始数据的内容或行数,只是让Categorical类型的存储更高效,因此文件体积减小但数据完整性完全保留。
内容的提问来源于stack exchange,提问作者natemcintosh

