【问题标题】:Storing objects in file instead of in memory将对象存储在文件中而不是内存中
【发布时间】:2016-06-16 05:50:37
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

  • 您有没有考虑使用数据库的原因?
  • 从文件中提取单个记录意味着通读文件直到找到正确的记录。我强烈建议迁移到具有现代 64 位环境和合理 RAM 量的计算机。如果您仍然想优化您的程序,请提供MCVE。如果它目前有效,请考虑改为询问 Code Review。
  • @IgnacioVazquez-Abrams 我考虑过,但在每一代之后,至少有 95% 的个体被替换。使用数据库似乎不是正确的方向,因为数据记录只保留很短的时间。
  • @TigerhawkT3 你说得对,我必须遍历文件,直到找到正确的行。我将在其上运行它的计算机是 64 位的,但是,可用 RAM 的数量受到限制,并且由于我的人口的未知树大小,我可能会超过可用的物理 RAM,即使应用程序被给予更多不仅仅是2GB。我不认为任何代码示例都是必要的,因为我更概念性地询问将人口数据写入文件是否是减少内存使用的解决方案。
  • MCVE 可能允许我们提出一种在不牺牲性能的情况下优化 RAM 使用的方法。

标签: python memory memory-management genetic-programming


【解决方案1】:

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

这个想法是反复繁殖一两个新孩子,评估他们的健康状况,然后将它们直接重新引入种群本身,杀死一些先前存在的个体,为它们腾出空间。

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

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

岛屿模型是另一种/额外的可能性:人口被分成单独的子人口(族裔)。 Demes 会派人互相帮助传播有关该空间新发现的合适区域的消息。

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


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

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

【讨论】:

  • 我认为稳定状态可能是我前进的方向。所以因为你没有真正的世代,你是否需要标记每个人是否计算了他们的适应度,然后一次每个迭代循环计算被错误标记的个体的适应度,或者只要将个体添加到群体中就计算它们的适应度?
  • @Tory 如果您使用某种形式的精英主义,您将立即需要适应能力(您必须将新个体与您想要替换的个体进行比较)。
【解决方案2】:

请记住,如果您使用“稳定状态”,则需要有一些方法来使最适合的个体杂交的概率高于不适合的个体。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 2016-10-11
    • 2015-07-27
    • 1970-01-01
    相关资源
    最近更新 更多