Я начал использовать модуль полки Python (и я новичок в Python как таковой), и хотя он отлично хранит и загружает информацию, использование ОЗУ ... странно.
Части, которые я хочу сохранить, это карта, которая находится в определенных координатах другой карты, и набор значений, таких как 'fov1' и 'fov2', которые могут существовать или не существовать для любой данной координаты. Например, на «миникарте» при x = 50 и y = 100 может быть другая карта, и я хочу сохранить это. Мини-карта [50] [100] также может иметь, например, список для fov0 и fov1, но не что-нибудь еще. Максимальное значение поля зрения fov75.
Вот мои функции сохранения / загрузки.
Эта функция сохранения предназначена для просмотра, какие карты нужно сохранить (те, которые не являются пустыми и не сохранены в данный момент), а затем сохранить карту как Xcoord + 'x' + Ycoord (например, '50x100') и сохранить части fov. как Xcoord + 'x' + Ycoord + 'f' + номер поля зрения (например, '50x100f2'). Это все работает отлично. Затем я также хочу удалить карту, хранящуюся в ОЗУ, и удалить все существующие сегменты 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()
Между тем, вот функция загрузки, предназначенная для вызова карты, всех полей зрения и их возврата. Опять же, это прекрасно работает.
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()
Тем не менее, странность связана с использованием оперативной памяти, поскольку я наблюдал за диспетчером задач во время его тестирования. Простое сохранение одной карты фактически увеличивает ПЗУ, которое использует питон! Конечно, это не может быть правильно? В качестве альтернативы, если я сохраняю большой кусок сразу, ОЗУ выключается, как и должно быть, но затем, если я загружаю их все обратно, ОЗУ тогда значительно выше, чем было до того, как они были сохранены. Если я затем сохраню / загрузлю снова, ОЗУ не увеличится; оно увеличивается только в первом цикле сохранения / загрузки, а затем никогда. Я работал над этим весь день и не могу понять, что является причиной этой странности и как ее можно решить. Кто-нибудь может мне помочь?
Редактировать: да, используя Python 2.7.2. Кроме того, не нужно сохранять более 9 карт одновременно.