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

Speicher wird zugemüllt ?



<< |< 1 2 >| >> 11 Einträge, 2 Seiten
BrownWolf
 2004-01-12 11:21
#79074 #79074
User since
2003-08-15
308 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich programmiere ja zur Zeit an einem Socket Chatserver.
Ein Tester meinte nach einiger Zeit kommt die Fehlermeldung: ide0(3,3): write failed, user block limit reached.

Und er kann dann nix mehr im Chat schreiben.
Muss man Arrays und Hashes mit "undef" aus dem Speicher entfernen, da sie sonst drinbleiben ?
Code (perl): ()
1
2
3
sub _{s;;xrqIpiql\\{}p{pl{R>rl{N{}gjwpkssq]>rl{N;;;*{{}=*{_};;
&#36{{}={q{{{}}}=>[reverse+split+reverse+q;}{;]};&#36{{}->{q{{{}}}}->[@{{}];}
&#36{{}=reverse+_(q{{}}=>q{{}})^chr(30)x+length&_(q{{}}=>,q{{}})and+print;
ptk
 2004-01-12 12:02
#79075 #79075
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Wenn keine Referenz mehr auf Variablen bestehen, und wenn malloc() es schafft, dann werden diese Variablen geloescht.
BrownWolf
 2004-01-12 12:10
#79076 #79076
User since
2003-08-15
308 Artikel
BenutzerIn
[default_avatar]
Kann es daran liegen das das Chatlog zu groß geworden ist und keiner mehr reinschreiben kann ? Oder evtl. weil die Datei geflockt wurde und mehrere gleichzeitig schreiben ?
Code (perl): ()
1
2
3
sub _{s;;xrqIpiql\\{}p{pl{R>rl{N{}gjwpkssq]>rl{N;;;*{{}=*{_};;
&#36{{}={q{{{}}}=>[reverse+split+reverse+q;}{;]};&#36{{}->{q{{{}}}}->[@{{}];}
&#36{{}=reverse+_(q{{}}=>q{{}})^chr(30)x+length&_(q{{}}=>,q{{}})and+print;
Crian
 2004-01-12 12:22
#79077 #79077
User since
2003-08-04
5871 Artikel
ModeratorIn
[Homepage]
user image
Eigentlich sollte es reichen, große Arrays auf undef zu setzen,um den Inhalt loszuwerden (falls es nicht noch andere Referenzen darauf gibt). Die Frage ist nur, wann die Garbage Collection diesen einsammelt und freigibt.

Ist Dein Problem denn wirklich ein Speicherproblem? Bitte doch den Tester, bei dem das Problem auftritt, seinen freien Speicher im Auge zu behalten, während der Test läuft.
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
ptk
 2004-01-12 12:48
#79078 #79078
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=Crian,12.Jan..2004, 11:22]Eigentlich sollte es reichen, große Arrays auf undef zu setzen,um den Inhalt loszuwerden (falls es nicht noch andere Referenzen darauf gibt). Die Frage ist nur, wann die Garbage Collection diesen einsammelt und freigibt.
[/quote]
Es gibt keine klassische Garbage Collection bei perl. Sobald keine Referenzen mehr existieren (also wenn SvREFCNT_dec zu einem Referenzzaehler gleich Null fuehrt) wird das Objekt freigegeben. Dann obliegt es malloc() dafuer zu sorgen, ob der Speicher tatsaechlich an das Betriebssystem zurueckgegeben wird.
Strat
 2004-01-12 13:23
#79079 #79079
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
waere interessant zu wissen, an welcher stelle dieser Fehler auftaucht... mit dem Arbeitsspeicher scheint das wohl eher nichts zu tun zu haben, denn sonst kaeme wohl eher ein Out-Of-Memory-Error

Zur Freigabe des Speichers:
1. am besten, man ueberlaesst es Perl, aufzuraeumen, indem man die Variabe (inkl. Referenzen) Out-Of-Scope bringt. undef %groessereDatenstruktur kann manchmal ganz schoen lange brauchen (damit meine ich nicht nur ein paar Sekunden).
2. Ich habe irgendwie noch kein Betriebssystem gefunden, unter dem Perl den freigewordenen Speicher tatsaechlich so ans Betriebssystem zurueckgibt, dass das Betriebssystem ihn gleich wieder verwenden kann. Der freigewordene Speicher kann jedoch von diesem Perl-Prozess selbst wiederverwendet werden, wobei es da ein paar Tricks gibt, um die Speicherfragmentierung zu verringern, z.B. indem man moeglichst am Anfang des Programmes den Speicher fuer grosse Arrays oder Hashes voralloziiert, z.B. $#array = 100000; (natuerlich nur, wenn man mindestens 100000 elemente darin braucht). Das kann auch einen ganz schoenen Laufzeitgewinn bringen...\n\n

<!--EDIT|Strat|1073906702-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Crian
 2004-01-12 13:49
#79080 #79080
User since
2003-08-04
5871 Artikel
ModeratorIn
[Homepage]
user image
Wieviel Speicher legt er denn für jeden Arrayeintrag an, wenn Du $#array = 100000; angibst?

Für verschieden lange Strings wirds wohl nicht reichen, eher für je eine Referenz oder so, oder?
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
ptk
 2004-01-12 15:00
#79081 #79081
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=Crian,12.Jan..2004, 12:49]Wieviel Speicher legt er denn für jeden Arrayeintrag an, wenn Du $#array = 100000; angibst?
[/quote]Devel::Size sagt es dir.
Quote
Für verschieden lange Strings wirds wohl nicht reichen, eher für je eine Referenz oder so, oder?

Das Array selbst enthaelt nur Zeiger auf SVs. Die SVs selbst muessen dann nochmal alloziert werden, ggfs. zusaetzlich mit dem Platz fuer die eigentlichen Strings.
ptk
 2004-01-12 15:06
#79082 #79082
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=Strat,12.Jan..2004, 12:23]
2. Ich habe irgendwie noch kein Betriebssystem gefunden, unter dem Perl den freigewordenen Speicher tatsaechlich so ans Betriebssystem zurueckgibt, dass das Betriebssystem ihn gleich wieder verwenden kann. [/quote]
Linux (oder besser: einige glibc-Versionen von Linux) allozieren grosse Speicherbloecke ("gross" ist dabei 128K, kann per Environment-Variable geaendert werden) per mmap(). Das hat den Vorteil, dass mit munmap() dieser Speicher komplett zurueckgegeben wird. Der Nachteil von mmap() ist, dass es recht langsam ist und es wahrscheinlich auch eine Obergrenze fuer die Gesamtzahl von mmap-Bereichen gibt; deshalb wird diese Moeglichkeit nicht generell fuer das Speichermanagement verwendet.
Strat
 2004-01-12 15:12
#79083 #79083
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
@ptk: dankeschoen, habe ich wieder was gelernt.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2004-01-12 11:21.