Font
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]6107[/thread]

speicher freigeben

Readers: 3


<< >> 6 entries, 1 page
guest Gast
 2004-03-01 23:56
#80443 #80443
hallo!

ich habe folgendes problem beim schreiben eines perl-robots für wartungszwecke:
der robot arbeitet instanziert in einer schleife etwa 5 millionen perl objekte (nacheinander) und führt für jedes objekt einige methoden mit datenbanktransaktionen aus.

leider sprengt der durchlauf jedesmal die speichergrenze von 130 megabyte und das programm bricht ab.

ich verwende use strict;
alle bezeichner werden ausserhalb der schleife mit
my bezeichner
deklariert
am begin der scheife werden alle variablen und objekte mit
$bezeichner=undef zurückgesetzt.

(perlversion 5.6)
hat jemand eine idee, wie ich den speicher bei jedem schleifendurchgang wieder 100%ig freimachen kann`?

vielen dank
lg
esskar
 2004-03-02 00:18
#80444 #80444
User since
2003-08-04
7321 articles
ModeratorIn

user image
ohne code kann man da kaum was dazu sagen!
Crian
 2004-03-02 01:19
#80445 #80445
User since
2003-08-04
5871 articles
ModeratorIn
[Homepage]
user image
Das Problem ist, dass die Garbage Collection nicht definiert, wann der Speicher zurückgegeben wird.
Hast Du vielleicht irgendwelche Array oder Hashelemente in den Objekten, die nicht sauber freigegeben werden? (Ev. stecken in den Arrays... auch weitere Objekte, die man wiederum erst sauber löschen muss?)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Crian
 2004-03-02 01:21
#80446 #80446
User since
2003-08-04
5871 articles
ModeratorIn
[Homepage]
user image
[quote=Guest,01.03.2004, 22:56](perlversion 5.6)[/quote]
Da könnte sich der Umstieg auf 5.8 lohnen, denn gerade im Punkto Speicherbereinigung hat sich da was getan.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Strat
 2004-03-02 01:27
#80447 #80447
User since
2003-08-04
5246 articles
ModeratorIn
[Homepage] [default_avatar]
wie esskar schon sagte: ohne code ist es schwierig...

ein paar allgemeine hinweise:
x) perl5.6 hat einige ziemliche speicherleaks, die dabei vielleicht eine Rolle spielen; vielleicht mal mit 5.8.2 testen?
x) wenn jedes objekt seine eigene datenbankverbindung aufmacht, dann koennte das auch ganz schoen RAM kosten (habe da mit Win32::ODBC mal mein blaues Wunder erlebt, weiss aber nicht, ob es auch bei dem Modul, das du fuer die Datenbankverbindung verwendest, dieses Problem gibt)
x) verwende - wenn moeglich - besser my-variablen innerhalb der schleife, dies ist - wenn moeglich - sparsamer als wenn du sie ausserhalb deklarierst und intern immer mit undef zuruecksetzt. gerade bei groesseren Datenstrukturen ist es oft effektiver, wenn man die Variablen einfach durch verlassen des Gueltigkeitsbereiches aufraeumen lasst als sie explizit mit undef zu killen.
x) wird nach dem destroy mancher objekte nicht vernuenftig aufgeraeumt (z.B. zirkulaere Referenzen? wenn ja, dann muesstest du die im destructor manuell aufbrechen, sodass der Speicher freigegeben werden kann)
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
ptk
 2004-03-02 13:06
#80448 #80448
User since
2003-11-28
3645 articles
ModeratorIn
[default_avatar]
Noch eine Idee: perl mit der anderen malloc-Konfiguration uebersetzen. D.h. entweder mit usemymalloc oder ohne.
<< >> 6 entries, 1 page



View all threads created 2004-03-01 23:56.