dask - 当 df 为 `dd.read_parquet` 时,Dask 内存不足,但在 `from_pandas` 时工作正常……为什么?
问题描述
import pandas as pd
from dask.distributed import Client
client = Client(n_workers=4)
给定一个大约 63 毫米行的 DF,有 3 列int64
和 2 列object
(长度小于 10 个字符的字符串),
这个:
df1 = dd.read_parquet('..')
df1 = df1.repartition(npartitions=100)
df1.head()
...在显示以下内容后失败并KilledWorker
出现错误:
distributed.nanny - WARNING - Worker exceeded 95% memory budget. Restarting
distributed.nanny - WARNING - Restarting worker
distributed.nanny - WARNING - Worker exceeded 95% memory budget. Restarting
distributed.nanny - WARNING - Restarting worker
distributed.nanny - WARNING - Worker exceeded 95% memory budget. Restarting
distributed.nanny - WARNING - Restarting worker
distributed.nanny - WARNING - Worker exceeded 95% memory budget. Restarting
distributed.nanny - WARNING - Restarting worker
但后来这个:
df2 = pd.read_parquet('..')
df2 = dd.from_pandas(df2, npartitions=100)
df2.head()
瞬间工作(我的意思head
是,加载当然需要时间)。
我知道后者在将其提供给 Dask 之前已将整个 df 加载到内存中。但那有什么意义dd.read_parquet
呢?我一定是做错了,刚从 Dask 开始。
更新:
- 每个工作人员的内存限制 7.8GiB
- parquet 文件在磁盘上为 914Mb;不确定如何通过 Dask 查看磁盘使用情况,临时文件夹中有 4 个空目录
- 这是一台在 Linux 上运行的具有 32Gb RAM 的单一准系统 EC2 机器,唯一的进程是这个 jupyter notebook,所以大部分内存应该是可用的
cluster memory
仪表板的一部分显示高达 32Gb 的绘图;和Bytes stored = 405.57MiB
- 不确定如何查找每个分区的内存
- 我不坚持要 100 个分区,但对单个分区和 1000 个分区有完全相同的问题。
解决方案
推荐阅读
- java - 控制器单元测试无法自动装配所需的 bean
- android - 卡在 gradle build :app:transformClassesWithDexBuilderForDebug
- sql - 从记录中获取最小值
- javascript - 如何在 div jquery 中显示溢出隐藏元素
- laravel - 十月CMS插件记录更新服务器内部错误
- python - 匹配两个数据帧的两列之间的名称并添加新列以延长计算时间
- python - 程序正在执行其他操作时的更新加载栏
- python - 如何按函数创建包含列名的变量?
- java - java - 如何从我的控制台的输出文件中获取特定的xml标签
- c - cs50 Pset2:Crack - 用 '==' 帮助我理解一些东西