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

Python 将对象存储在文件中而不是内存中,python,memory,memory-management,genetic-programming,Python,Memory,Memory Management,Genetic Programming,我已经用Python创建了一个遗传编程系统,但是我遇到了与内存限制相关的问题。问题在于将我的群体中的所有个体存储在内存中。目前,我将所有个体存储在内存中,然后复制下一代的种群,然后将其存储在内存中。这意味着我在内存中加载了两个群体的个体。经过一些测试,我发现我很快就超过了Windows默认的2GB应用程序内存大小 目前,我将整个种群的各个树写到一个文件中,然后如果需要,我可以加载并重新创建种群。我一直在考虑的不是将所有的个体加载到内存中,而是通过从文件中提取个体并仅实例化单个个体来访问个体信息。

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

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

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


谢谢

考虑到RAM约束,我会将人口模型从世代转换为稳定状态

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

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

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

岛屿模型是另一种/额外的可能性:种群被分成不同的子种群(DEME)。Demes将个人发送给其他人,以帮助传播新发现的空间适配区域的消息

通常这是一种异步机制,但您可以使用同步算法,一个接一个地加载demes,从而大大减少所需的内存资源


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


无论如何,你应该考虑到,根据你的GP系统的任务,你可以登记一个巨大的性能指标。

< P>记住,如果你使用稳定状态,你需要有一些方法让最适合的个体杂交的概率高于不适合的个体。 您可以考虑的另外两个选项是:

a) 使用SQLLite。(). 这将具有使用数据库(可能更多)的所有性能优势,以及使用文件的简单性和易用性


b) 有一个混合的非稳态模型,允许保留一个大的、未评估的群体,大小为M,以及一个最适合的个体大小为N的“幸存者集”,其中M>>N。人口是解决方案对象的队列,但生存集是有限大小的“评估的解决方案”(用适应度修饰的解决方案)。因此,您不断地从总体中获取解决方案,对它们进行评估,然后将它们放入EvaluatedSolution堆(按适合度降序排序),并裁剪前N个元素。这样,你的内存消耗保持不变,但你有精英的概念。这也允许通过只使用精英作为繁殖群体来进行“繁殖”之类的酷把戏。

有没有理由不考虑使用数据库?从文件中提取单个记录意味着在找到合适的记录之前一直阅读文件。我强烈建议使用一台具有现代64位环境和合理内存量的计算机。如果您想优化您的程序,请提供一个。如果它现在工作,考虑询问代码审查代替。@ IGANACIOVAZKZ阿布勒姆斯我认为它,但在每代至少有95%的人口中的个人被替换。使用数据库似乎不是正确的方向,因为数据记录只会持续很短的时间。@TigerhawkT3你说得对,我必须遍历文件,直到找到正确的行。我将在其上运行此功能的计算机是64位的,但是,在可用的RAM数量方面受到限制,并且由于我的群体的未知树大小,我可能会超过可用的物理RAM,即使应用程序的可用内存超过2GB。我不认为有任何代码示例是必要的,因为我要问的是更多的概念性问题,是否将填充数据写入文件是减少内存使用的解决方案。MCVE可能允许我们提出一种在不牺牲性能的情况下优化RAM使用的方法。我认为稳态可能是我将要面对的方向。因为你没有真正的世代,你是否需要标记每个个体是否计算了他们的适应度,然后每个迭代循环计算一次假标记个体的适应度,或者,当个体加入到人群中时,计算他们的适应度?如果你使用某种形式的精英主义,你立即需要适应度(你必须将新个体与你想要替换的个体进行比较)。