утечка памяти Python - PullRequest
       5

утечка памяти Python

0 голосов
/ 23 октября 2011

У меня есть массив объектов 'cell', созданный так:

class Cell:
  def __init__(self, index, type, color):
    self.index = index
    self.type = type
    self.score = 0
    self.x = index%grid_size
    self.y = int(index/grid_size)
    self.color = colour


alpha = 0.8
b = 2.0
grid_size = 100
scale = 5

number_cells = grid_size*grid_size
num_cooperators = int(number_cells*alpha)       
cells = range(number_cells)
random.shuffle(cells)
cooperators = cells[0:num_cooperators]
defectors = cells[num_cooperators:number_cells]
cells = [Cell(i, 'C', blue) for i in cooperators]
cells += [Cell(i, 'D', red) for i in defectors]
cells.sort(compare)

Я собираю атрибуты из них в цикле, например:

while 1:
    pixArr = pygame.PixelArray(windowSurfaceObj)
    for cell in cells:
        x = cell.x
        y = cell.y
        color = cell.color
        for y_offset in range(0,scale):
            for x_offset in range(0,scale):
                pixArr[x*scale + x_offset][y*scale + y_offset] = color
    del pixArr
    pygame.display.update()

Я теряю память как сумасшедший ... что происходит?

Ответы [ 2 ]

1 голос
/ 05 сентября 2013

В PixelArray, похоже, есть ошибка.

Следующий код повторяет утечку памяти, устанавливая каждый цикл по одному пикселю, и вам даже не нужно обновлять дисплей, чтобы вызвать проблему:

import pygame, sys
from pygame.locals import *
ScreenWidth, ScreenHeight = 640, 480
pygame.init()
Display = pygame.display.set_mode((ScreenWidth,ScreenHeight), 0, 32)
pygame.display.set_caption('Memory Leak Test')
while True:
    PixelArray = pygame.PixelArray(Display)
    PixelArray[ScreenWidth-1][ScreenHeight-1] = (255,255,255)
    del PixelArray
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
#pygame.display.update()

Если вы можете справиться с падением производительности, замена прямой настройки пикселя на (очень короткие) строки позволяет избежать утечки памяти, например: pygame.draw.line (Display, Color, (X, Y), (X, Y), 1)

0 голосов
/ 23 октября 2011

Класс Cell можно увеличить (запомнить) с помощью слотов. Это должно существенно сократить потребление памяти:

class Cell(object):
    __slots__ = ('index', 'type', 'color')
    ...

Единственная большая структура в вашем коде - это pixArr. Возможно, вы захотите отслеживать его размер с помощью sys.getsizeof . Еще один инструмент для отслеживания утечек - это печатать gc.garbage .

...