I have an array of 'cell' objects created like so:
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)
I am grabbing attributes from them in a loop like so:
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()
I am leaking memory like crazy... what's going on?
The Cell class can be tighted-up (memorysize) by using slots. That ought to substantially reduce memory consumption:
The only large structure in your code is pixArr. You might want to monitor its size with sys.getsizeof. Another tool for tracking down leaks is to pretty print gc.garbage.
There appears to be a bug in PixelArray.
The following code replicates the memory leak by setting a single pixel each loop, and you don't even have to update the display to cause the problem:
If you can handle the performance hit, replacing direct pixel setting with (very short) lines avoids the memory leak, ie: pygame.draw.line(Display, Colour, (X,Y), (X,Y), 1)