我的问题是执行类似的事情:
multicore_apply(serie, func)
运行
所以我尝试创建一个函数:
def adaptator(func, queue) :
serie = queue.get().apply(func)
queue.put(serie)
def parallel_apply(ncores, func, serie) :
series = [serie[i::ncores] for i in range(ncores)]
queues =[Queue() for i in range(ncores)]
for _serie, queue in zip(series, queues) :
queue.put(_serie)
result = []
jobs = []
for i in range(ncores) :
jobs.append(process(target = adaptator, args = (func, queues[i])))
for job in jobs :
job.start()
for queue, job in zip(queues, jobs) :
job.join()
result.append(queue.get())
return pd.concat(result, axis = 0).sort_index()
我知道i::ncores
没有优化,但实际上并不是问题所在:
如果输入len大于30000,则进程永远不会停止...
这是对Queue()
的误解吗?
我不想使用multiprocessing.map
:要应用的func是一个非常复杂且具有相当大的类的方法,因此共享内存使得它太慢了。这里我希望在解决进程问题时将其传递到队列中。
感谢您的建议
答案 0 :(得分:0)
可能会有所帮助 - 您可以使用multiprocessing
lib。
您的multicore_apply(serie, func)
应如下所示:
from multiprocessing import Pool
pool = Pool()
pool.map(func, series)
pool.terminate()
您可以指定要创建的进程计数,如pool = Pool(6)
,默认情况下它等于计算机上的核心数。
答案 1 :(得分:0)
经过多夜的激烈搜索后,我在python开发网站上发布了关于队列中对象最大大小的帖子解决了问题:问题出在这里。我在stackoverflow上发现here使用了另一篇文章:
然后我完成了以下程序,但效果不如大型对象预期的那样高效。我会为每个轴做同样的事情。
注意这个版本允许使用复杂的类作为函数参数,我不能用pool.map
def adaptator(series, results, ns, i) :
serie = series[i]
func = ns.func
result = serie.apply(func)
results[i] = result
def parallel_apply(ncores, func, serie) :
series = pd.np.array_split(serie, ncores, axis = 0)
M = Manager()
s_series = M.list()
s_series.extend(series)
results = M.list()
results.extend([None]*ncores)
ns = M.Namespace()
ns.func = func
jobs = []
for i in range(ncores) :
jobs.append(process(target = adaptator, args = (s_series, results, ns, i)))
for job in jobs :
job.start()
for job in jobs :
job.join()
print(results)
因此,如果你在队列之间放置大对象,Ipython冻结