python - 使用 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
)
提前致谢!
解决方案
Dask 确实以块的形式加载您的数据,并将它们以块的形式写入输出。总内存使用量取决于
- 每个块的大小,在 parquet 中称为“行组”,不可分割。解压解码后需要内存大小
- 您一次处理的块数,如果您不进行其他配置,这可能是您的 CPU 中的内核数
请注意,在处理过程中还需要一些中间值,因此您通常希望每个 worker 的每个线程都能够适应一个上帝的交易,而不仅仅是一个块的数据价值。
推荐阅读
- python-3.x - 打印熊猫数据框时如何抑制“dtype”行?
- cors - 访问 http://localhost:65418/api/stripe 已被 CORS 策略阻止
- delphi - Delphi Rio 帮助中包含的最脏的示例代码。有什么明显的我遗漏了吗?
- python - 如何仅使用 django 模型中过滤的几个模型将文件上传到 AWS?
- excel - 无法在网站的用户名框中输入
- laravel - 如何在本地使用 Laravel 4 api 调用在 Ionic 4 中获取图像
- c++ - Cin 没有产生所需的结果
- julia - 使用 rand() 提高性能
- javascript - 即使使用 .then(),承诺仍然未决
- hyperledger-fabric - 向所有对等方广播交易