繁体   English   中英

如何在写入镶木地板之前计算磁盘上的 Pandas Dataframe 大小?

[英]How to calculate Pandas Dataframe size on disk before writing as parquet?

使用 python 3.9 与 Pandas 1.4.3 和 PyArrow 8.0.0。

我有几个镶木地板文件(都具有相同的架构),我想将它们合并到某个阈值(不是固定大小,但不高于阈值)。

我有一个目录,我们称之为包含镶木地板文件的input

现在,如果我使用os.path.getsize(path)我得到磁盘上的大小,但合并 2 个文件并取该大小的总和(即 os.path.getsize(path1) + os.path.getsize(path2) ) 由于元数据和其他因素,自然不会产生好的结果。 在将文件写入镶木地板之前,我尝试了以下操作以查看是否可以对文件大小进行某种指示。

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)

我知道大小在很大程度上取决于压缩、引擎、模式等,因此我想简单地考虑一个因素。 简单地说,如果我想要每个文件 1mb 的阈值,那么实际阈值为 4mb,因为我假设压缩会将数据压缩 75%(4mb -> 1mb)

所以总的来说我会有类似的东西

compressed_threshold_in_mb = 1
compression_factor = 4

并且保持将数据附加到合并的 dataframe 的条件是检查两者的乘积,即:

if total_accumulated_size > compressed_threshold_in_mb * compression_factor:

假设total_accumulated_size是 dataframe 在磁盘上的重量的累加器

您可以将数据框保存到 memory 中的镶木地板,以准确了解它将使用多少数据:

import io
import pandas as pd

def get_parquet_size(df: pd.DataFrame) -> int:
    with io.BytesIO() as buffer:
        df.to_parquet(buffer)
        return buffer.tell()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM