Dask.bag.map_partitions 函数接收生成器而不是列表

Dask.bag.map_partitions function receives a generator instead of a list

我是 运行 看起来像这样的 dask 图:

dask.bag.from_delayed(...).pluck(FEATURE_NAME).map(map_func).map_paritions(part_func)

我在 part_func 的执行过程中遇到错误,结果是接收生成器而不是袋子物品 map_func 正在返回。

这感觉像是图形优化,我确实找到了 lazify_task 并认为它与问题有关,还有 reify 图形节点(我找不到的任何文档)。

虽然在 part_func 的开头添加 values = list(values) 行似乎可以解决手头的问题并让我的图表运行,但我觉得我可能在这里遗漏了一些关于内部实现的东西,构建图形的优化 and/or 方法。

是的,您的理解是正确的,即 dask 包中的分区通常是有限生成器而不是列表。这允许它们在更少的内存中运行。

如果您想始终与列表交互,那么您可以按照您的建议,在输入上调用 list 或者在您的操作之间调用 map_partitions(list)

lazify_taskreify 等优化通常被认为是内部优化,可以随时更改。我不建议构建依赖于它们的应用程序。这也是为什么它们没有被优先记录的部分原因。