为什么在经过过滤的Dask数据帧上运行compute()需要这么长时间



我正在使用以下方法读取数据:ddf1 = dd.read_sql_table('mytable', conn_string, index_col='id', npartitions=8)

当然,由于延迟计算,这是即时运行的。这张表有几亿行。

接下来,我想过滤这个Dask数据帧:

ddf2 = ddf1.query('some_col == "converted"')

最后,我想将其转换为Pandas数据帧。结果应该只有大约8000行:

ddf3 = ddf2.compute()

然而,这需要很长时间(约1小时(。我能得到关于如何大幅加快速度的建议吗?我尝试过使用.compute(scheduler='threads'),改变分区的数量,但到目前为止都没有成功。我做错了什么?

首先,您可以使用sqlalchemy表达式语法对查询中的filter子句进行编码,并在服务器端进行过滤。如果数据传输是您的瓶颈,那么这是您的最佳解决方案,尤其是对筛选器列进行索引。

根据您的DB后端,sqlalchemy可能不会发布GIL,因此您的分区不能在线程中并行运行。您所得到的只是线程之间的争用和额外的开销。您应该将分布式调度程序与进程一起使用。

当然,查看您的CPU和内存使用情况;使用分布式调度程序,您还可以访问诊断面板。您还应该关注内存中每个分区的大小。

最新更新