【问题标题】:How to calculate Pandas Dataframe size on disk before writing as parquet?如何在写入镶木地板之前计算磁盘上的 Pandas Dataframe 大小?
【发布时间】:2022-08-05 17:47:33
【问题描述】:

将 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)) 自然会赢\'由于元数据和其他因素,t 会产生良好的结果。 在将文件写入镶木地板之前,我尝试了以下操作以查看是否可以对文件大小进行某种指示。

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

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

if total_accumulated_size > compressed_threshold_in_mb * compression_factor:

假设total_accumulated_size 是数据帧在磁盘上的重量的累加器

标签: python pandas dataframe pyspark pyarrow


【解决方案1】:

您可以将数据框保存到内存中的 parquet 中,以准确了解它将使用多少数据:

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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 2020-03-23
    • 2019-09-02
    相关资源
    最近更新 更多