多处理池:返回最小元素

问题描述 投票:0回答:1

我想使用 multiprocessing.Pool 运行任务并仅返回最小元素,而不占用内存来存储每个输出。

到目前为止我的代码:

with Pool() as pool:
  programs = pool.map(task, groups)
  shortest, l = min(programs, key = lambda a: len(a[0]))

这可行,但是这会占用 pool.map() 的结果的大量内存。

groups
是一个集合,它可能很大,结果会占用很多内存。

我想要这样的方法:

with Pool() as pool:
  shortest, l = pool.execute_and_return_min(task, groups, key = lambda a: len(a[0]))

(内部比较结果并返回最小元素)

或:

with Pool() as pool:
  shortest = l = None
  for program, k in pool.apply_and_return_as_generator(task, groups):
    if shortest is None or len(program) < len(shortest):
      shortest = program
      l = k

(它的工作方式与普通池类似,但在计算后立即从生成器返回值)

我找不到池的任何方法来实现这样的事情。由于我只想要最小元素,所以我不关心执行顺序。 可能是我搜索的时候不够仔细

如有任何帮助,我们将不胜感激。首选的是使用 Pool() 的解决方案,但如果您知道如何使用 pther 技术来实现此解决方案 - 请继续。

提前致谢!

python multiprocessing minimum memory-efficient
1个回答
0
投票

阅读评论后,我找到了最适合我的解决方案。

正如 @Robin De Schepper 指出的,有

imap
方法,它是
map
方法的惰性版本。 对我来说更好的是
imap_unordered
,我最后选择了它。

惰性生成器的优点是它不必处理所有项目即可获得可用结果。此外,无序变体甚至更好,因为它会在值准备好后立即返回值。由于我不需要保留顺序,因此这是最佳使用方法。

最终解决方案:

with Pool() as pool:
  shortest = l = None
  for program, k in pool.imap_unordered(task, groups):
    if shortest is None or len(program) < len(shortest):
      shortest = program
      l = k
© www.soinside.com 2019 - 2024. All rights reserved.