error: out of memory

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

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
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'>:
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

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
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

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...
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

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?
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

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.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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:
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Bald ist ja Inyoka da! \o/


Naja.. `bald` :D
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

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.
Antworten