使用pandas进行Python3.5多处理:进程永不停止

时间:2016-06-06 09:27:54

标签: python pandas multiprocessing

我的问题是执行类似的事情:

multicore_apply(serie, func)

运行

所以我尝试创建一个函数:

用于在进程中运行apply方法的函数:

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是一个非常复杂且具有相当大的类的方法,因此共享内存使得它太慢了。这里我希望在解决进程问题时将其传递到队列中。

感谢您的建议

2 个答案:

答案 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冻结