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

2024-04-19 17:23:41 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

谢谢!你知道吗


Tags: 文件数据实例记忆内存信息应用程序readline
2条回答

考虑到RAM约束,我将把种群模型从世代模型改为稳态模型。你知道吗

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

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

更改实现应该不太难,但是您必须注意过早收敛(即调整参数,如变异率、锦标赛大小…)。你知道吗

岛模型是另一种可能性:种群被分解成不同的亚种群(demes)。德米特派个人互相帮助传播新发现的太空区域的消息。你知道吗

通常它是一种异步的机制,但是您可以使用一种同步算法,一个接一个地加载demes,大大减少了所需的内存资源。你知道吗


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

无论如何,您应该考虑,根据您的GP系统正在执行的任务,您可以注册一个巨大的性能影响。你知道吗

记住,如果你使用稳定状态,你需要有一些方法使最适合的个体杂交的概率高于不太适合的个体。你知道吗

您可以考虑的几个附加选项是:

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

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

相关问题 更多 >