首页 > 解决方案 > 使用 dask.DataFrame.to_parquet() 写入大文件

问题描述

我有一个 .pq 文件(大约 2Gb),我想在其中使用 dask 更改列名。

我将文件读取到 dask DataFrame 没有问题,而且我还可以重命名列。但是,当使用 ddf.to_parquet() 将 .pq 文件写回磁盘时,该作业会失败,因为 dask 似乎试图将其放入内存(但它不适合)。

为什么会这样?我预计 dask 会迭代地执行此操作。如何分块写入目标文件?

下面是我正在使用的代码。

import dask.dataframe as dd

ddf = dd.read_parquet(
    '/path/to/file/file.pq',
    engine='pyarrow'
)

ddf = ddf.rename(columns={'old_column_name': 'new_column_name'})

# the step which fails
ddf.to_parquet(
    '/path/to/file/edited/',
    engine='pyarrow',
    write_index=False
)

提前致谢!

标签: pythonpandasdaskparquet

解决方案


Dask 确实以块的形式加载您的数据,并将它们以块的形式写入输出。总内存使用量取决于

  • 每个块的大小,在 parquet 中称为“行组”,不可分割。解压解码后需要内存大小
  • 您一次处理的块数,如果您不进行其他配置,这可能是您的 CPU 中的内核数

请注意,在处理过程中还需要一些中间值,因此您通常希望每个 worker 的每个线程都能够适应一个上帝的交易,而不仅仅是一个块的数据价值。


推荐阅读