如何在写入Parquet文件前估算Pandas DataFrame的磁盘占用大小?
合并同Schema Parquet文件并控制输出大小
环境配置
- Python 3.9
- Pandas 1.4.3
- PyArrow 8.0.0
核心需求
需要合并input目录下所有Schema一致的Parquet文件,且合并后的单个文件大小不得超过指定阈值。直接通过os.path.getsize(path)累加原文件大小来预估最终输出大小并不准确,因为元数据等因素会影响实际写入后的文件体积。
尝试的大小预估方法
为了预估DataFrame写入Parquet前的内存/磁盘占用,我测试了以下几种方式:
print(df.info()) print(df.memory_usage().sum()) print(df.memory_usage(deep=True).sum()) print(sys.getsizeof(df)) print(df.values.nbytes + df.index.nbytes + df.columns.nbytes)
基于压缩因子的阈值控制方案
由于最终文件大小受压缩方式、读写引擎、Schema等因素影响,我采用压缩因子来动态设置阈值:
例如,若目标压缩后的文件大小阈值为1MB,假设数据压缩比为75%(即4MB的内存数据压缩后为1MB),可按如下方式定义参数:
compressed_threshold_in_mb = 1 compression_factor = 4
后续通过判断累计预估大小(total_accumulated_size,即合并中DataFrame预估磁盘占用的累加值)是否超过compressed_threshold_in_mb * compression_factor,来决定是否继续向当前合并DataFrame追加数据。
内容的提问来源于stack exchange,提问作者Ori Refael
相关产品推荐
相关产品推荐

