我正在使用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,但是,然后,我收到一条错误消息,说明"数据"我调用评估函数时没有定义。你能解释一下我如何读取文件,然后只将数组传递给进程