Python搁置;加载/保存时意外的RAM使用情况

时间:2012-04-02 22:40:19

标签: python memory loading save shelve

我已经开始使用Python的搁置模块(我本身就是Python的新手),虽然它完美地存储和加载信息,但RAM的使用却很奇怪。

我要保存的部分是一张位于另一张地图的某些坐标上的地图,以及一系列值,例如“fov1”和“fov2”,这些值可能存在,也可能不存在于任何给定的坐标。例如,在x = 50和y = 100的“minimap”上,可能有另一张地图,我想要保存。例如,Minimap [50] [100]也可能有fov0和fov1的列表,但不能包含任何其他内容。最大fov值是fov75。

这是我的保存/加载功能。

此保存功能是指查看哪些地图需要保存(非空白,当前未保存),然后将地图保存为Xcoord +'x'+ Ycoord(例如'50x100')并保存fov部件作为Xcoord +'x'+ Ycoord +'f'+ fov的编号,(例如'50x100f2')。一切正常。然后我还希望它删除当时在RAM中保存的地图,并删除所有存在的fov段,以便释放内存。这似乎也有效。

def save_maps():
file = shelve.open(savename, 'w')
for x in range(200):
    for y in range(200):
        if minimap[x][y].map is not 'blank' and minimap[x][y].map is not 'saved':
            mapname = str(x) + 'x' + str(y)
            file[mapname] = minimap[x][y].map
            minimap[x][y].map = 'saved'
            for p in range(76):
                try:
                    fov = getattr(minimap[x][y], 'fov' + str(p))
                    fovname = str(x) + 'x' + str(y) + 'f' + str(p)
                    file[fovname] = fov
                    delattr(minimap[x][y], 'fov' + str(p))
                except:
                    pass
file.close()

与此同时,这里是加载函数,用于调出地图,所有fov,并将它们重新放入。再次,这非常有效。

def load_map(x, y):
file = shelve.open(savename, 'w')
mapname = str(x) + 'x' + str(y)
minimap[x][y].map = file[mapname] 
for p in range(76):
    try:
        fovname = str(x) + 'x' + str(y) + 'f' + str(p)
        setattr(minimap[x][y], 'fov' + str(p), file[fovname])
    except:
        pass
file.close()

然而,奇怪的是RAM的使用,因为我一直在看任务管理器,因为我测试它。简单地保存单个地图实际上增加了RAM python正在使用!当然那不可能是对的吗?或者,如果我一次保存一个大块,RAM会按原样下降,但是如果我将它们全部加载,那么RAM会比它们保存之前的要高得多。如果我再次保存/加载,则RAM不会上升;它只会在第一个保存/加载周期增加,然后再也不会增加。我整天都在研究这个问题,无法解决造成这种陌生感的原因,以及如何解决这个问题。任何人都可以帮助我吗?

编辑:哦,是的,使用Python 2.7.2。此外,一次不会超过9张地图需要保存。

1 个答案:

答案 0 :(得分:0)

任务管理器报告的RAM使用率与进程的实际工作集没有密切关系。重要的是要记住,内存管理是在多个级别处理的。操作系统将大块内存提供给进程的堆,在这种情况下,Python运行时将从进程堆中分配并自由返回进程堆,而不会向操作系统返回大量内存(除非在特殊情况下)。

shelve模块可能在将数据写入磁盘之前至少部分数据的搁置版本,因此这解释了初始增加。

如果重复读取和写入不会增加正在使用的内存总量,并且您有足够的内存来执行您正在执行的操作,则此处无需关注。