【问题标题】:Dask computations take a long time to initialize in Jupyter notebook在 Jupyter 笔记本中初始化 Dask 计算需要很长时间
【发布时间】:2019-01-17 04:37:14
【问题描述】:

我正在尝试使用 Dask 通过 Jupyter 笔记本在我的笔记本电脑上处理大于内存的数据集。数据在 Amazon-s3 存储桶中存储为多个 csv 文件。

第一个单元运行得很快,我可以按预期在端口 8787 上查看 Dask 仪表板。

from dask.distributed import Client
import dask.dataframe as dd
client = Client()
client

第二个单元格在 55.1 秒内执行,这对我来说似乎很奇怪,因为它实际上并没有提取任何数据。

df = dd.read_csv('s3://*/*/*.csv', assume_missing=True)

这第三个单元格挂起 11 分钟,然后我在仪表板的任务流中看到任何内容,但随后它按预期工作,总共执行了 13m 3s。

df['timestamp']=dd.to_datetime(df['timestamp'], unit='ms')
df = df.set_index('timestamp')
df = client.persist(df)

这似乎与Dask Distributed client takes to long to initialize in jupyter lab 在精神上相似,但我的客户开始正常,最终一切正常。我错过了一些明显的东西吗?谢谢!

【问题讨论】:

  • 我忘记了版本! python 3.6 和 dask 0.19.4
  • "许多 csv 文件" - 多少? df 有多少个分区?
  • year/month/day/hour/3 or 4 files 每个大约 500 到 1000 行。只有 2018 年和 2019 年的文件。所以大约有 40,000 个分区。然而,我引用的时间是从一个月开始的。

标签: amazon-s3 jupyter-notebook dask dask-distributed


【解决方案1】:

当然,您可以运行分析器来找出究竟是什么需要时间。甚至调度程序也有分析信息,尽管不那么容易访问。

可能是,扫描 S3 上许多文件的所有文件信息所花费的时间。 Dask 必须列出所有这些文件,以了解它们有多大并分配要读取的块,这需要许多慢速 HTTP 调用。

正如您所发现的,这反过来又会产生大量的任务。任务的总图必须序列化并发送到调度程序,以便执行,然后由调度程序处理并发送给工作人员。图表越大,这些成本加起来就越多。

简而言之,如果您想优化数据吞吐率,最好将传入的数据分成更大的块。您将看到一些建议的数据块大小为 100MB。

【讨论】:

  • 我怀疑分区方案不是最优的,但我想我希望它不会妨碍阅读。过去,我将范围限制为一个月的数据,使用for 循环读取一堆熊猫数据帧,然后将它们连接起来。这在我喝完咖啡之前就完成了,所以我不介意。你会推荐什么进行分析?我怀疑cProfile.run('client.persist(df)') 不是正确的,但我在这里是一个完整的分析n00b。
  • 我通常从snakeviz开始,但是那里有很多工具
猜你喜欢
  • 1970-01-01
  • 2019-04-25
  • 1970-01-01
  • 2018-12-27
  • 2022-06-15
  • 1970-01-01
  • 2017-09-03
  • 2019-04-30
  • 2019-08-12
相关资源
最近更新 更多