我正在与 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__":
保护之下,但是,然后,我收到一条错误消息,说当我调用评估函数时未定义“数据”。你能解释一下我如何读取文件一次,然后只将数组传递给进程吗