我正在运行一个进化算法来优化单独模拟环境中的函数(也用Python编写)。模拟环境本身是一个python类实例,并且计算量很大(每次运行约4秒)并占用大约1Gb的内存。由于我在这个模拟环境中生成大约十万个不同的函数进行测试,我需要一种方法尽可能多地离线模拟。
我能做的是预先计算大部分模拟(即初始化类的一个实例,然后运行一些类函数的子集),然后在算法中仅为一个小组件触发(例如剩下的课堂内的一些功能)。这通常会将评估时间缩短到约1秒,从而显着改善运行时间。
但是,每次将新函数传递到模拟类实例时,函数都会更改类实例(从而影响下一个函数求值的结果)。我可以通过在每次评估之前对整个类实例进行深度复制来防止这种情况发生,但最终比每次运行整个模拟要慢。
有没有办法避免在每个阶段深入复制整个班级但得到相同的结果?基本上每个函数评估都需要在完全相同的类实例上执行。
由于
答案 0 :(得分:1)
所以事实证明这个问题是Python的Multiprocessing.Pool类的问题(我没有提到过,因为我认为它不是问题的一部分)。默认情况下,池中的每个worker都会在池打开的整个时间段内生存。由单个工作程序执行的所有进程在任何时候都保留在内存中,并且由于将单个类实例传递给这些工作程序,因此每次执行解决方案时都会更新该类实例。解决这个问题的简单方法是使用Multiprocessing.Pool的“maxtasksperchild”参数来限制单个工作程序在被杀死之前可以处理的任务数量以及在其位置生成的新任务。将此值设置为1已解决了我的所有问题。
答案 1 :(得分:0)
这并没有直接解决你不断发展的课程的问题,但我对cPickle的表现有很好的经验来保存课程实例。我使用它来保存自定义数据结构的状态,这些结构非常大,加载和保存是非常快的操作。