Полка Python;неожиданное использование ОЗУ при загрузке / сохранении - PullRequest
1 голос
/ 03 апреля 2012

Я начал использовать модуль полки 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 карт одновременно.

1 Ответ

0 голосов
/ 03 апреля 2012

Использование оперативной памяти, сообщаемое диспетчером задач, не тесно связано с фактическим рабочим набором процесса.Важно помнить, что управление памятью осуществляется на нескольких уровнях.ОС доставляет большие куски памяти в кучу процесса, и в этом случае среда выполнения Python выделяет и освобождает кучи процесса, не возвращая ОС значительный объем памяти (за исключением необычных ситуаций).

Модуль полки, вероятно, составляет по крайней мере части отложенной версии данных в памяти до их записи на диск, что объясняет первоначальное увеличение.

Если повторные операции чтения и записи не увеличивают общий объем используемой памяти, и у вас достаточно памяти для выполнения того, что вы делаете, здесь не о чем беспокоиться.

...