我有一长串用户(约200,000)和相应的数据框df
及其属性。现在我想写一个for循环来测量用户的成对相似性。代码如下:
df2record = pd.DataFrame(columns=['u1', 'u2', 'sim'])
for u1 in reversed(user_list):
for u2 in reversed(list(range(1, u1))):
sim = measure_sim(df[u1], df[u2]))
if sim < 0.6:
continue
else:
df2record = df2record.append(pd.Series([u1, u2, sim], index=['u1', 'u2', 'sim']), ignore_index=True)
现在我想用多处理来运行这个for循环,我已经阅读了一些教程。但我仍然不知道如何正确处理它。似乎我应该首先设置合理数量的流程,例如6
。然后我应该将每个循环输入一个进程。但问题是我怎么知道某个过程中的任务已经完成,以便可以开始新的循环?你能帮帮我吗?提前谢谢你!
答案 0 :(得分:1)
您可以使用multiprocessing.Pool提供方法map
,该方法在给定的iterable上映射进程池。这是一些示例代码:
def pairGen():
for u1 in reversed(user_list):
for u2 in reversed(list(range(1, u1))):
yield (u1, u2)
def processFun(pair):
u1, u2 = pair
sim = measure_sim(df[u1], df[u2]))
if sim < 0.6:
return None
else:
return pd.Series([u1, u2, sim], index=['u1', 'u2', 'sim'])
def main():
with multiprocessing.Pool(processes=6) as pool:
vals = pool.map(processFun, pairGen())
df2record = pd.DataFrame(columns=['u1', 'u2', 'sim'])
for v in vals:
if vals != None:
df2record = df2record.append(v, ignore_index=True)
答案 1 :(得分:0)
首先,我不建议对这么小的数据使用多处理。尤其是在使用数据框时。因为数据框有它自己的批次功能,可以在很多方面帮助你。你只需要编写适当的循环。
使用:multiprocessing.Pool
只需将用户列表作为迭代器(process_size = list_of_user)传递给pool.map()。你只需要稍微调整一下就可以创建你的迭代器。
from multiprocessing import Pool
with Pool() as pool:
pool = multiprocessing.Pool(processes=6)
pool.map(function, iterator)