将对象存储在文件中而不是内存中

Storing objects in file instead of in memory

我在 Python 中创建了一个遗传编程系统,但遇到了与内存限制相关的问题。问题在于将我人口中的所有个体存储在内存中。目前,我将所有个体存储在内存中,然后繁殖下一代的人口,然后将其存储在内存中。这意味着我在内存中加载了两个人口价值的个人。经过一些测试,我发现我很快就超过了 Windows 的默认 2GB 应用程序内存大小。

目前,我将整个种群的个体树写到一个文件中,然后我可以根据需要加载并重新创建种群。我一直在考虑的不是将所有个体都加载到内存中,而是通过从文件中拉出个体并仅实例化该个体来访问个体信息。根据我对 Python 的 readline 功能的理解,它应该一次只从文件中加载一行,而不是整个文件。如果我这样做,我想我将只能在内存中存储我当前正在操纵的个体。

我的问题是,这样做是否存在我现在没有看到的突出问题?我知道因为我处理的是磁盘上的数据而不是内存中的数据,所以我的性能会受到影响,但对于这种情况,内存比速度更重要。此外,我不想增加分配给 Python 程序的 2GB 内存。

谢谢!

鉴于 RAM 限制,我会将人口模型从世代更改为 稳态

我们的想法是迭代培育一两个新的 child,评估它们的适应性,然后将它们直接重新引入种群本身,杀死一些先前存在的个体为它们腾出空间。

稳态使用传统遗传算法一半的内存,因为一次只有一个种群。

改变实现应该不会太难,但你必须注意过早收敛(即调整参数,如变异率、锦标赛规模......)。

岛屿模型是另一种/额外的可能性:人口被分解成单独的sub-populations (demes)。 Demes 派人互相帮助传播 space 适宜区域的消息。space。

通常是异步机制,但你可以使用同步算法,一个一个地加载族群,大大减少所需的内存资源。


当然,您可以将种群写入文件,然后只加载需要的个体。如果您选择这种方法,计算个人的哈希签名以优化识别/加载速度可能是个好主意。

无论如何,您应该考虑到,根据您的 GP 系统正在执行的任务,您可能会遭受巨大的性能损失。

请记住,如果您使用稳态,您将需要一些方法来使最适合的个体杂交品种的概率高于不太适合的个体。

您可以考虑的其他几个选项是:

a) 使用 SQLLite。 (https://docs.python.org/2/library/sqlite3.html)。这将具有使用数据库的所有性能优势(可能更多)以及使用文件的简单性和易用性。

b) 有一个混合非稳态模型,允许保持一个大的、未评估的 Polulation,大小 M 和一个 "Survivor Set" 最适合的个体大小 N,其中 M >> N。人口是解决方案对象的队列,但 SurvivorSet 是 Heap 的 "EvaluatedSolutions" 的有限大小(用 Fitness 装饰的解决方案)。因此,您不断从总体中获取解决方案,对它们进行评估,然后将它们放入 EvaluatedSolution 堆(按适应度降序排列)并裁剪前 N 个元素。这样,你的内存消耗保持不变,但你有内置的精英概念。这也允许通过只使用精英作为繁殖种群来做一些很酷的技巧,比如 "breeding"。