多处理:处理大型数据集

时间:2015-10-03 14:29:18

标签: python multiprocessing deap

我正在使用DEAP。 我正在针对大型数据集(400个浮点数400,000列)评估一个人口(目前有50个人)。 我已经成功测试了算法而没有任何多处理。执行时间约为40秒/代。 我想与更多的人群和更多代人一起工作,所以我尝试通过使用多处理加速。

我想我的问题与多处理比与DEAP更相关。 此问题与进程之间共享内存/变量没有直接关系。主要问题是如何最小化磁盘访问。

我已经开始使用Python多处理模块了。

代码看起来像这样

toolbox = base.Toolbox()

creator.create("FitnessMax", base.Fitness, weights=(1.0,))
creator.create("Individual", list, fitness=creator.FitnessMax)

PICKLE_SEED = 'D:\\Application Data\\Dev\\20150925173629ClustersFrame.pkl'
PICKLE_DATA = 'D:\\Application Data\\Dev\\20150925091456DataSample.pkl'


if __name__ == "__main__":
    pool = multiprocessing.Pool(processes = 2)
    toolbox.register("map", pool.map)    

data = pd.read_pickle(PICKLE_DATA).values

然后,再进一步:

def main():


    NGEN = 10
    CXPB = 0.5
    MUTPB = 0.2


    population = toolbox.population_guess()
    fitnesses = list(toolbox.map(toolbox.evaluate, population))
    print(sorted(fitnesses, reverse = True))
    for ind, fit in zip(population, fitnesses):
        ind.fitness.values = fit
    # Begin the evolution
    for g in range(NGEN):

评估功能使用全局"数据"变量。 最后:

if __name__ == "__main__":

    start = datetime.now()    
    main()
    pool.close()
    stop = datetime.now()
    delta = stop-start
    print (delta.seconds)

所以:主要的处理循环和池定义由if __name__ == "__main__":保护。

它以某种方式起作用。执行时间是: 1个过程:398秒 2个过程:270秒 3个过程:272秒 4个过程:511秒

多处理不会显着缩短执行时间,甚至可能会对其造成伤害。

4个过程(缺乏)性能可以通过内存约束来解释。我的系统基本上是分页而不是处理。

我猜其他测量可以通过加载数据来解释。

我的问题:

1)据我所知,每次模块作为单独的进程启动时,都会读取和取消激活文件。它是否正确?这是否意味着每当它包含的一个函数将被map调用时它将被读取?

2)我试图在if __name__ == "__main__":后卫下移动unpickling,但是,然后,我收到一条错误消息,说明"数据"我调用评估函数时没有定义。你能解释一下我如何读取文件,然后只将数组传递给进程

0 个答案:

没有答案