Seite 1 von 1

error: out of memory

Verfasst: Samstag 5. April 2008, 16:32
von Imperator
Hallo Community,

ich bekomme die Fehlermeldung: 'error: out of memory
bedeutet das, dass etwas aus dem arbeitsspeicher gelöscht wurde? Wenn ja, kann man dagegen etwas tun, schließlich erledigt das Python ja automatisch.
Oder liegt es an etwas anderem. so eine Fehlermeldung hatte ich noch nie.

Verfasst: Samstag 5. April 2008, 16:38
von Leonidas
Das bedeutet, dass der Interpreter zu viel Speicher allokiert hat und der Kernel ihn daraufhin beendet hat.

Sowas kommt normalerweise extrem selten vor, ich würde darauf tippen, dass du ein C-Modul hast, das Speicher leakt (massiv sogar). Was machst du in deinem Programm und welche (non-stdlib) Module benutzt du denn?

Verfasst: Samstag 5. April 2008, 17:02
von Imperator
Hallo Leonidas,

bei dem Programm handelt es sich um das Spiel, mit dem ich euch schon so viel genervt habe :wink:
neben Pygame verwende ich darin auch os und random

Verfasst: Samstag 5. April 2008, 17:08
von BlackJack
Noch eine Möglichkeit wäre, dass Du irgendwo nur *versuchst* zu viel Speicher an zu fordern. Einfaches Beispiel:

Code: Alles auswählen

In [94]: [None] * 2**30
---------------------------------------------------------------------------
<type 'exceptions.MemoryError'>           Traceback (most recent call last)

/home/bj/<ipython console> in <module>()

<type 'exceptions.MemoryError'>:

Verfasst: Samstag 5. April 2008, 17:15
von Imperator
Ich glaube langsam komme ich dem ganzen auf die Spur. Da ist nämlich grade so ein "ganz kleiner" Bug. Ich poste mal den Code, damit ihr es asuprobieren könnt. Der ist ziemlich komisch und ich habe so die Vermutung dass der den Ram frisst. Obwohl das eigentlich auch nicht sein dürfte. Hm, na ja wäre vielleicht eh schlauer gewesen den gleich zu posten:

Code: Alles auswählen

import pygame, os, random
from pygame.locals import*
os.environ['SDL_VIDEO_CENTERED'] = '1'
pygame.init()
pygame.display.set_caption('Burning Planets')

class gegner():
    def __init__(self, x, y):
        self.image = pygame.image.load('Kunst.jpg')
        self.rect = self.image.get_rect()
        self.rect.center = (x, y)
        self.life = 100
        self.attackieren = True
        self.am_leben = True
        
    def KI(self):
        if self.am_leben:
           if event.type == MOUSEBUTTONDOWN and isplaying == False and stehen == True:
               point = pygame.mouse.get_pos()
               if self.rect.collidepoint(point):
                   self.life = self.life - 50
           if self.attackieren == True:
                self.verfolgen()
           else:
               self.nach_angriff()
               self.pos_control() 
           if self.life < 0:
               self.am_leben = False

    def verfolgen(self):
        if self.rect.centerx > player.centerx:
            self.rect = self.rect.move(-2, 0)
        if self.rect.centerx < player.centerx:
            self.rect = self.rect.move(2, 0)
        if self.rect.centery > player.centery:
            self.rect = self.rect.move(0, -2)
        if self.rect.centery < player.centery:
            self.rect = self.rect.move(0, 2)
        if self.rect.colliderect(player):
            datei = file('treffer.txt', 'w')
            datei.write('1')
            datei.close()
            self.attackieren = False
            
    def pos_control(self):
        if self.rect.centerx > 899:
            self.rect = self.rect.move(-2, 0)
        if self.rect.centerx < 1:
            self.rect = self.rect.move(2, 0)
        if self.rect.centery > 699:
            self.rect = self.rect.move(0, -2)
        if self.rect.centery < 1:
            self.rect = self.rect.move(0, 2)

    def nach_angriff(self):
        moeglichkeiten = [-40, 40]
        entfernungx = random.choice(moeglichkeiten)
        entfernungy = random.choice(moeglichkeiten)
        self.rect = self.rect.move(entfernungx, entfernungy)
        if player.centerx - self.rect.centerx > 200:
            self.attackieren = True
        elif self.rect.centerx - player.centerx > 200:
            self.attackieren = True
        elif player.centery - self.rect.centery > 200:
            self.attackieren = True
        elif self.rect.centery - player.centery > 200:
            self.attackieren = True

class station():
    def __init__(self, x, y):
        self.image = pygame.image.load('grovesprt.bmp')
        self.image = pygame.transform.scale(self.image, (50, 50))
        self.rect = self.image.get_rect()
        self.rect.center = (x, y)
        self.life = 100

    def KI(self):
        target = player.centerx
        position = self.rect.centerx
        if target < position:
            self.image = pygame.transform.rotate(self.image, 2)
        if target > position:
            self.image = pygame.transform.rotate(self.image, 2)
            
        
        
        
        


        
            
            
pygame.mouse.set_cursor(*pygame.cursors.broken_x)        
landschaft = pygame.image.load('Creek.jpg')
hintergrund = pygame.transform.scale(landschaft, (900, 700))
karte = hintergrund.get_rect()
spieler = pygame.image.load('Hopsy.bmp')
player = spieler.get_rect()
player.center = (450, 350)
black = 0, 0, 0
size = width, height = 900,700
screen = pygame.display.set_mode(size)
screen.fill(black)
move_up = False
move_down = False
move_right = False
move_left = False
stehen = True
munition = 5
life = 100
bert = gegner(200, 200)
maxi = gegner(500, 500)
basis1 = station(300, 250)
while True:
    datei = file('treffer.txt', 'r')
    wert = datei.read()
    if wert == '1':
        life = life - 10
        datei.close()
        datei = file('treffer.txt', 'w')
        datei.write('0')
        datei.close()
    screen.fill(black)
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                pygame.quit()
            if event.key == K_w:
                move_down = False
                move_right = False
                move_left = False
                move_up = True
                stehen = False
            if event.key == K_s:
                move_up = False
                move_right = False
                move_left = False
                move_down = True
                stehen = False
            if event.key == K_a:
                move_down = False
                move_up = False
                move_right = False
                move_left = True
                stehen = False
            if event.key == K_d:
                move_down = False
                move_up = False
                move_left =False
                move_right = True
                stehen = False
            if event.key == K_SPACE:
                move_up = False
                move_down = False
                move_right = False
                move_left = False
                stehen = True
            if event.key == K_f:
                if stehen == True:
                    munition = 5
            
    if move_up:
        player = player.move(0, -4)
        
    if move_down:
        player = player.move(0, 4)
        
    if move_right:
        player = player.move(4, 0)
        
    if move_left:
        player = player.move(-4, 0)
     
    
    if event.type == MOUSEBUTTONDOWN:
        isplaying = pygame.mixer.music.get_busy()
        if isplaying == False:
            if stehen == True:
                if munition > 0:
                    pygame.mixer.music.load('shot1.wav')
                    pygame.mixer.music.play()
                    munition = munition - 1

    bert.KI()
    maxi.KI()
    basis1.KI()
    screen.blit(hintergrund, karte)
    if life > 0:
        screen.blit(spieler, player)
    screen.blit(bert.image, bert.rect)
    screen.blit(maxi.image, maxi.rect)
    screen.blit(basis1.image, basis1.rect)
    pygame.display.flip()
also meiner Meinung nach dürfte der Bug da aber auch nicht dran Schuld sein

Verfasst: Samstag 5. April 2008, 17:54
von audax
Bitte arbeite deinen Code um nach PEP 8.

Und ich würde die Bilder extern initialisieren, also z.B. nicht das Bild laden wenn station initialisiert wird. Außerdem solltest du generell alle Konstanten auslagern an den Anfang der Datei:

Code: Alles auswählen

STATION =  pygame.image.load('station.png')
STEP = 2

# snip
    def verfolgen(self):
        if self.rect.centerx > player.centerx:
            self.rect = self.rect.move(-STEP, 0)
Und so weiter...

Verfasst: Samstag 5. April 2008, 18:17
von Imperator
audax hat geschrieben:Bitte arbeite deinen Code um nach PEP 8.

Und ich würde die Bilder extern initialisieren, also z.B. nicht das Bild laden wenn station initialisiert wird. Außerdem solltest du generell alle Konstanten auslagern an den Anfang der Datei:

Code: Alles auswählen

STATION =  pygame.image.load('station.png')
STEP = 2

# snip
    def verfolgen(self):
        if self.rect.centerx > player.centerx:
            self.rect = self.rect.move(-STEP, 0)
Und so weiter...
hallo audax,

was bringt das denn mit den Konstanten an den Anfang des Codes, und so weiter? Dient das nur der Schönheit, oder hat das auch einen technischen Nutzen?

Verfasst: Samstag 5. April 2008, 18:40
von audax
Schönheit, Wartbarkeit.

Dann würden sogar Außenstehende den Code kapieren ;)

http://en.wikipedia.org/wiki/Magic_numb ... l_constant

€dit:
Das Forum ist verbugt.
Wenn ich den Link explizit in [url] einschließe...wird mein Post nicht mehr angezeigt.

Verfasst: Samstag 5. April 2008, 19:34
von sma
In Zeile 124 wird eine Datei innerhalb einer Schleife immer und immer wieder geöffnet und nicht geschlossen, wenn deren Inhalt != '1' ist. Das erscheint mir äußerst fragwürdig und ich würde annehmen, dass hier das Betriebssystem seine File-Handles aufbrauchen kann (Python ist doch nicht verpflichtet, diese wieder zu schließen, oder?). Ob das zu dem Out-Of-Memory-Fehler führt, wage ich nicht zu behaupten.

Auch das Laden der wav-Datei für einen Schußgeräusch scheint mir fragwürdig - ich würde erwarten, dass die Datei genau einmal geladen wird und dann die Musikdaten wiederverwendet werden. Ich weiß nicht, wie der Mixer da funktioniert, aber vielleicht ist das ja die Ursache für dein Speicherleck...

Stefan

Verfasst: Samstag 5. April 2008, 20:17
von Leonidas
audax hat geschrieben:Das Forum ist verbugt.
Wenn ich den Link explizit in [url] einschließe...wird mein Post nicht mehr angezeigt.
Eek. Tatsächlich. Das scheint dann zu passieren, wenn man URLs in Tags setzt, die phpBB nicht als URLs ansieht. Das nenne ich mal broken. Habe ich schon erwähnt, dass wir nicht planen, ewig auf phpBB zu bleiben? :roll:

Verfasst: Samstag 5. April 2008, 21:18
von audax
Bald ist ja Inyoka da! \o/


Naja.. `bald` :D

Verfasst: Sonntag 6. April 2008, 09:02
von Imperator
Urks, da war ich wohl fahrlässig

Edit: Also, ich bin mir jetzt ziemlich sicher dass das an dem Bug liegt. Denn die Meldung kommt nicht immer, erst nach einiger Zeit. Und da der Bug alles stark ins Ruckeln bringt, würde das ja auch passen.