【问题标题】:Merging a huge list of dataframes using dask delayed使用 dask 延迟合并大量数据帧
【发布时间】:2018-11-18 23:49:32
【问题描述】:

我有一个向我返回数据框的函数。我正在尝试通过使用 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

【问题讨论】:

    标签: dask dask-delayed


    【解决方案1】:

    一般规则:如果您的数据适合内存(包括基本大小乘以可能的中间值的小数),那么 Pandas 很有可能对您的用例来说是快速高效的。

    特别是对于您的情况,您尝试并行化的任务很有可能不会释放 python 的内部锁 GIL,在这种情况下,尽管您有独立的线程,但一次只能运行一个。解决方案是改用“分布式”调度程序,它可以混合多个线程并进行处理;但是,使用进程需要在客户端和进程之间移动数据的成本,并且您可能会发现额外的成本在任何时间节省中占主导地位。您当然希望确保在工作人员中加载数据,而不是从客户端传递。

    简短的说,你应该做一些实验,做好测量,并仔细阅读数据框架和分布式调度器文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-24
      • 2018-03-04
      • 2018-09-04
      • 2023-04-04
      • 2019-07-24
      • 2019-10-18
      相关资源
      最近更新 更多