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.
error: out of memory
-
- 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?
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
Hallo Leonidas,
bei dem Programm handelt es sich um das Spiel, mit dem ich euch schon so viel genervt habe
neben Pygame verwende ich darin auch os und random
bei dem Programm handelt es sich um das Spiel, mit dem ich euch schon so viel genervt habe
neben Pygame verwende ich darin auch os und random
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'>:
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:
also meiner Meinung nach dürfte der Bug da aber auch nicht dran Schuld sein
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()
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:
Und so weiter...
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)
hallo audax,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:Und so weiter...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)
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?
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.
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.
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
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
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
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?audax hat geschrieben:Das Forum ist verbugt.
Wenn ich den Link explizit in [url] einschließe...wird mein Post nicht mehr angezeigt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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.
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.