1

我已经开始使用 Python 的搁置模块(而且我对 Python 本身很陌生),虽然它可以完美地存储和加载信息,但 RAM 的使用是......奇怪。

我要保存的部分是位于另一个地图的某些坐标上的地图,以及对于任何给定坐标可能存在或不存在的值的选择,例如“fov1”和“fov2”。例如,在 x=50 和 y=100 的“小地图”上,可能有另一张地图,我想要保存。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 的使用,因为我在测试它时一直在看任务管理器。简单地保存一个地图实际上增加了 python 正在使用的 RAM!这肯定不对吧?或者,如果我一次保存一大块,RAM 会按原样下降,但是如果我将它们全部加载回来,那么 RAM 就会比保存它们之前的值高得多。如果我再次保存/加载,RAM 不会增加;它只会在第一个保存/加载周期增加,然后再也不会增加。我整天都在研究这个问题,无法弄清楚是什么导致了这种奇怪,以及如何解决它。谁能帮我吗?

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

4

1 回答 1

0

任务管理器报告的 RAM 使用情况与进程的实际工作集没有密切关系。重要的是要记住,内存管理是在多个级别上处理的。操作系统将大量内存传送到进程的堆中,在这种情况下,Python 运行时将从进程堆中分配并释放回进程堆,而不会将大量内存返回给操作系统(异常情况除外)。

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

如果重复读取和写入不会增加正在使用的内存总量,并且您有足够的内存来做您正在做的事情,那么这里没有什么可担心的。

于 2012-04-02T23:16:59.233 回答