0

我正在与 DEAP 合作。我正在根据一个大型数据集(400.000 列 200 个浮点数)评估一个人口(目前 50 个人)。我已经成功地测试了算法,没有任何多处理。执行时间约为40s/代。我想与更大的人口和更多的世代一起工作,所以我尝试通过使用多处理来加快速度。

我想我的问题与多处理有关,而不是与 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 s 2 个进程:270 s 3 个进程:272 s 4 个进程:511 s

多处理不会显着提高执行时间,甚至会损害它。

4 进程(缺乏)性能可以用内存限制来解释。我的系统基本上是分页而不是处理。

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

我的问题:

1)我知道每次模块作为单独的进程启动时,都会读取和解压缩文件。这个对吗?这是否意味着每次 map 调用它包含的函数之一时都会读取它?

2)我试图将 unpickling 移到if __name__ == "__main__":保护之下,但是,然后,我收到一条错误消息,说当我调用评估函数时未定义“数据”。你能解释一下我如何读取文件一次,然后只将数组传递给进程吗

4

0 回答 0