是否有可能在Python中(也许使用dask,也许使用多重处理)将生成器“放置”在核心上,然后并行地单步执行生成器并处理结果?
它需要特别是生成器(或带有__iter__
);生成器生成的所有生成元素的列表不适合内存。
尤其:
有了熊猫,我可以打电话read_csv(...iterator=True)
,它给了我一个迭代器(TextFileReader) - 我可以for in
它或显式调用 next 多次。整个 csv 永远不会被读入内存。好的。
每次我从迭代器读取下一个块时,我也会对其执行一些昂贵的计算。
但现在我有2个这样的文件。我想创建 2 个这样的生成器,并在一个核心上“放置”1 个,在另一个核心上“放置”1 个,这样我就可以:
result = expensive_process(next(iterator))
在每个核心上并行,然后组合并返回结果。重复此步骤,直到一台发电机或两台发电机都超出产量。
看起来 TextFileReader 不可 pickle,生成器也不可。我不知道如何在 dask 或多处理中执行此操作。有这方面的模式吗?
Dask 的 read_csv 旨在以块的形式从多个文件加载数据,块大小可以指定。当您对生成的数据帧进行操作时,您将按块进行工作,这正是使用 Dask 的首要目的。应该不需要使用迭代器方法。
您最有可能想要使用的 dask dataframe 方法是map_partitions()
.
If you really想要使用迭代器的想法,你应该看看dask.delayed
,它能够通过将函数的每次调用(每个调用使用不同的文件名)发送给您的工作人员来并行化任意 python 函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)