5

我正在使用如何在 Pandas 中使用 apply 并行化许多(模糊)字符串比较dask

基本上我做了一些计算(不向磁盘写入任何内容)调用PandasFuzzywuzzy(如果有帮助的话,显然可能不会释放 GIL)并且我运行类似:

dmaster = dd.from_pandas(master, npartitions=4)
dmaster = dmaster.assign(my_value=dmaster.original.apply(lambda x: helper(x, slave), name='my_value'))
dmaster.compute(get=dask.multiprocessing.get)

但是,代码的一个变体现在已经运行了 10 个小时,还没有结束。我在 Windows 任务管理器中注意到

  • RAM utilization相当低,对应于我的数据大小
  • CPU usage每 2/3 秒左右从 0% 反弹到最多 5%
  • 20 Python processes的大小约为 100MB,一个 Python 进程可能包含 30GB 大小的数据(我有一台 128GB 的​​机器,8 核 CPU

问题是:这种行为是预期的吗?我在这里设置一些dask选项显然是非常错误的吗?

当然,我知道具体情况取决于我到底在做什么,但也许上面的模式已经可以说明某些事情是非常错误的?

非常感谢!!

4

1 回答 1

3

当然,我知道具体情况取决于我到底在做什么,但也许上面的模式已经可以说明某些事情是非常错误的?

这很到位。识别性能问题很棘手,尤其是在并行计算开始发挥作用时。以下是一些想到的事情。

  1. 多进程调度程序每次都必须在不同进程之间移动数据。序列化/反序列化周期可能非常昂贵。使用分布式调度程序会更好地处理这个问题。
  2. 您的函数helper可能正在做一些奇怪的事情。
  3. 通常最好避免使用 apply,即使在 Pandas 中也是如此。

通常,解决这些问题的一个好方法是创建一个最小的、完整的、可验证的示例,以分享其他人可以轻松复制和使用的示例。通常在创建这样的示例时,无论如何您都会找到解决问题的方法。但如果这没有发生,至少你可以将责任转嫁给图书馆维护者。在创建这样的示例之前,大多数库维护者都不会费心花时间,几乎总是有太多针对手头问题的细节来保证免费服务。

于 2016-07-01T22:18:44.503 回答