(Perl) Speicherverwaltung
Volker Mische
- programmiertechnik
0 Michael Schröpl0 k@rl
HI!
Ich habe eine Frage zur Speicherverwaltung von Perlscripten.
Wird beim Start eines Perlscripts dieses komplett inklusive seiner Variablen (also auch die Variablen die nur in bestimmten Fällen mit if auftreten) in den Speicher geladen, oder werden nur die Variablen in den Speicher geladen die gerade aufgerufen werden.
Auf was ich hinaus will: Ich screibe ein script mit sehr vielen Arrays und ifs, dabei trifft aber immer nur ein if mit einem Array ein. Wird dann also nur dieses eine Array, also ziemlich wenig, in den Speicher geladen, oder werden alle Arrays vom gesamten Script in den Speicher geladen?
Danke im Vorraus,
CU,
Volker Mische.
Wird dann also nur dieses eine Array, also ziemlich wenig, in den Speicher geladen, oder werden alle Arrays vom gesamten Script in den Speicher geladen?
Was Du wissen willst, das ist m. E. keine Eigenschaft der Sprache Perl, sondern eine Eigenschaft einer bestimmten Implementierung des Interpreters. Eine allgemeine Antwort wirst Du also wohl nicht bekommen.
Andererseits: Nichtskalare Datenstrukturen sind in Perl generell dynamisch. Anders als z. B. in Pascal definierst Du ja nicht die Zahl der Elemente eines Arrays (oder gar eines Hashes). Perl kümmert sich selbst darum, genügend Speicher bereitzustellen - das ist sehr erfreulich.
Starte mal unter Windows NT ein Perl-Skript mit langer Laufzeit und großem Speicherbedarf und schau Dir mit dem Programm-Manager an, wie sich der Platzbedarf entwickelt.
Dasselbe analog unter UNIX mit "ps -el".
Ich versuch's mal aus dem Gedächtnis zu beantworten, ohne die man pages zu lesen (was ich hiermit auch empfehle):
Perl hat meines Wissens nach keine "richtigen" Arrays, sondern die Arrays sind intern als verkettete Listen realisiert (und das ist [huhu Michael S.!] unabhängig vom Betriebssystem. d.h., nur die belegten Array-Elemente belegen Speicherplatz (liebe Perl-Cracks, korrigiert mich bitte, wenn ich irre)
Des weitenen ist es so, daß sich der Scope und - in Deinem Fall wichtiger - der Extend immer auf einen Block (also "{"..."}") beziehen. Beim Eintritt in den Block "{" wird - vereinfacht ausgedrückt - die Variable angelegt - soweit sie mit "my" deklariert wird - und beim Verlassen des Blocks "}" wird der Speicherplatz wieder freigegeben, es sei denn, daß die Werte noch anderweitig referenziert werden (z.B. indem ein Array als Ergebnis einer Funktion zurückgeliefert wird).
So, ich hoffe a) daß das hablwegs korrekt ist und ich b) Dich nicht zu sehr verwirrt habe. Empfehlung: man pages zu diesem Thema lesen.
Ansosnten: sollte Dein Programm so aufgebaut sein, daß alle Variablen am Anfang als globale Variablen definiert / deklariert werden, dann belegen sie alle Speicherplatz. Ggf. könnte es sich lohnen, die Definitionen / Deklarationen in Subroutinen zu verlegen und die Variablen dort mit "my" lokal zu deklarieren. Besser + eleganter wäre es, wenn Du Deine Programme objektorientiert schreibst und den dynaloader einsetzt.
Und noch angemerkt: wenn Du keine massiven Performance-Probleme hast, dann würde ich mir über die Frage nicht weiter den Kopf zerbrechen. Perl kann sowohl unter U*x als auch unter WinDOS *richtig* große Arrays verarbeiten.
Letzer Tip: schau' Dir mal den Befehl "undef" an :-)