更准确地说,我使用的是 Python 多处理
from multiprocessing import Pool
p = Pool(15)
args = [(df, config1), (df, config2), ...] #list of args - df is the same object in each tuple
res = p.map_async(func, args) #func is some arbitrary function
p.close()
p.join()
这种方法消耗了大量的内存; 几乎占用了我所有的 RAM (此时它会变得非常慢,因此使得多处理非常无用)。我假设问题在于 df
是一个巨大的对象(一个大熊猫数据框架) ,它会被复制到每个进程中。我已经尝试使用 multiprocessing.Value
共享数据帧而不进行复制
shared_df = multiprocessing.Value(pandas.DataFrame, df)
args = [(shared_df, config1), (shared_df, config2), ...]
(就像在 Python 多处理共享内存中建议的那样) ,但是这给了我 TypeError: this type has no size
(和 在 Python 进程之间共享一个复杂的对象?一样,不幸的是我不能理解它的答案)。
我第一次使用多重处理,也许我的理解还不够好。在这种情况下使用 multiprocessing.Value
真的是正确的吗?我已经看到了其他的建议(如排队) ,但现在有点困惑。共享内存有哪些选项,在这种情况下哪一个最好?