使用 dask.DataFrame.to_parquet() 写入大文件
Using dask.DataFrame.to_parquet() to write large file
我有一个 .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
)
提前致谢!
Dask 确实以块的形式加载您的数据,并将它们以块的形式写入输出。总内存使用量将取决于
- 每个块的大小,在 parquet 中称为“行组”,它们是不可分割的。你需要内存中的大小,解压解码后
- 您一次处理的块数,如果您不另外配置,这可能是您CPU中的核心数
请注意,在处理过程中还需要一些中间值,因此您通常希望每个 worker 的每个线程能够满足神的交易,而不仅仅是一个块的价值数据.
我有一个 .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
)
提前致谢!
Dask 确实以块的形式加载您的数据,并将它们以块的形式写入输出。总内存使用量将取决于
- 每个块的大小,在 parquet 中称为“行组”,它们是不可分割的。你需要内存中的大小,解压解码后
- 您一次处理的块数,如果您不另外配置,这可能是您CPU中的核心数
请注意,在处理过程中还需要一些中间值,因此您通常希望每个 worker 的每个线程能够满足神的交易,而不仅仅是一个块的价值数据.