使用延迟延迟合并庞大的数据帧列表

时间:2018-11-11 19:46:15

标签: dask dask-delayed

我有一个向我返回数据帧的函数。我正在尝试通过dask并行使用此功能。
我将数据帧的延迟对象添加到列表中。但是,无论有没有dask.delayed,我的代码的运行时间都是相同的。
我将functools中的reduce函数与pd.merge一起使用来合并我的数据框。
关于如何改善运行时间有什么建议吗?
可视化的图形和代码如下。

from functools import reduce 
d = []
for lot in lots:
    lot_data = data[data["LOTID"]==lot]
    trmat = delayed(LOT)(lot, lot_data).transition_matrix(lot)
    d.append(trmat)
df = delayed(reduce)(lambda x, y: x.merge(y, how='outer', on=['from', "to"]), d)

Visualized graph of the operations

1 个答案:

答案 0 :(得分:0)

一般规则:如果您的数据适合内存(包括基本大小乘以少量的可能的中间值),那么熊猫很可能会为您的用例提供快速高效的服务。

具体针对您的情况,您尝试并行化的任务很有可能不会释放python的内部锁GIL,在这种情况下,尽管您拥有独立的线程,但一次只能运行一个。解决方案是改为使用“分布式”调度程序,该调度程序可以具有多个线程的任意混合并进行处理;但是,使用流程要在客户端和流程之间移动数据要付出一定的代价,并且您可能会发现,多余的成本在节省时间方面占主导地位。您肯定希望确保在工作程序中加载数据,而不是从客户端传递数据。

短篇小说,您应该做一些实验,进行良好的测量,并仔细阅读数据框架和分布式调度程序文档。