【问题标题】:"chunksize" parameter in multiprocessing.Pool.mapmultiprocessing.Pool.map 中的“chunksize”参数
【发布时间】:2010-09-29 14:22:45
【问题描述】:

例如,如果我有一个带有 2 个处理器的池对象:

p=multiprocessing.Pool(2)

我想遍历目录中的文件列表并使用 map 函数

谁能解释一下这个函数的块大小是多少:

p.map(func, iterable[, chunksize])

如果我将 chunksize 例如设置为 10,这是否意味着每 10 个文件都应该使用一个处理器进行处理?

【问题讨论】:

标签: python multiprocessing


【解决方案1】:

查看documentation for Pool.map,您似乎几乎是正确的:chunksize 参数将导致可迭代对象被拆分为 大约 大小的片段,并且每个片段都作为单独的任务。

所以在您的示例中,是的,map 将采用前 10 个(大约),将其作为单个处理器的任务提交......然后接下来的 10 个将作为另一个任务提交,依此类推。请注意,这并不意味着这会使处理器每 10 个文件交替一次,很有可能处理器 #1 最终得到 1-10 和 11-20,而处理器 #2 得到 21-30 和 31-40。

【讨论】:

  • @newkid - 没什么特别的,你迭代的任何东西都会被分成大约每个处理器一个“东西”。
  • @DavidIreland 这是一个非常“经验法则”的领域。我不会直接用任务数除以处理器数,因为如果一个块由于参数或随机变化而提前完成,那么你就有一个处理器闲置。
  • @DavidIreland 我通常采用另一种方式 - 如果发送每个单独任务的开销不大(例如,您只按值传递几个参数),请使用一个块大小作为您的理论起点,并考虑每项任务需要多长时间以及差异有多大。您希望块大小使得时间变化与处理单个块所需的时间匹配(达到一个数量级)。
  • 感谢您的回复!在我了解块大小之前,我使用的是默认值 (1),它比不使用 MP 花费的时间更长,大概是因为开销。我没有考虑过一个进程是否由于模拟中的差异而完成,一个处理器可能会闲置,所以我想我必须选择一个足够大的块大小来克服将任务分配给处理器的开销,但不是大到处理器可能处于空闲状态。非常感谢!
  • 注意;池块大小在可迭代对象上运行 len() - 这意味着如果您使用 django 模型,它将评估 QuerySet。 - 最好自己分块。
猜你喜欢
  • 2012-01-21
  • 2017-11-29
  • 2019-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-14
  • 2020-04-21
  • 1970-01-01
相关资源
最近更新 更多