我在下面提供了一个具体示例,但这更多是我无法找到答案的关于Joblib的一般问题。还有类似的问题,例如关于共享Joblib缓存的this one,或试图避免复制大型只读numpy对象的this one,但我认为这些与我试图实现的目标不同
我的用例如下:我有一个大型的,全局定义的任意Python对象(在这种情况下,是pandas Dataframe的字典)。我想同时进行不同的聚合,而无需更改大对象。我的内存优化机器足够大,可以将对象放入内存 n 次,n是我可以使用的处理器数量,因此我不受内存的束缚。我在Linux上,这意味着无论如何我都应该获得写时复制的优势,但是据我了解,对于像数据帧这样的复杂对象,我真的不能依靠它。
使用Joblib进行计算的默认方式(请参见下面的代码)实际上大大降低了计算速度。当将batch_size = 100传递给Parallel()时,它有所改善,但实际上我不太确定为什么。
from joblib import Parallel, delayed
list_result_dfs = Parallel(n_jobs=8)(delayed(create_curve_comparison)(p) for p in parameters)
我在做什么错?这个问题可能缺少信息,但是我不知道确切提供什么,因此请在评论中提出,我会提供。我也不确定标题是否正确,但是我目前最好的猜测是,速度下降是由于每次迭代都会复制,销毁并再次复制大对象。