Klaus Mock: Speicherbedarf von Perl-Skripten

Beitrag lesen

Hallo,

Kann es sein das allein der geladene Source Code soviel Speicher braucht (dann muesste ich irgendwie probieren die Dateien aufzuteilen), oder muessen da noch irgendwelche "Memory-Leaks" sein?

Aus der Ferne kann ich das nur schwer einschätzen.
Ich hab mal folgendes propiert:
(Das alles unter Win2K, Activestate Perl Build 623)

c:> perl  [ca. 1.7 MByte Speicherbedarf]
use CGI;   [ca. 4 MByte]
use DBI;   [ca. 5.3 MByte]
for $i( 0...10000)
  {
  push @d,"sdjflkjfsdlkjldskjlksdflksfdlkdj";
  }

$x = <STDIN>; # nur daß das script nicht beendet wird
[ca. 6 MByte]
 bzw.
for $i( 0...10000)
  {
  $h{$i} = "ddklfjkldslkjsdlkfjlksdjlfkjsdlkj";
  }
$x = <STDIN>;
[ca. 8.8 MByte]

wobei der Unterschied von 2.3 MByte bei 'use CGI;' schon einiges sagt. Allein anhand der Größe des Sources läßt sich sowas also nicht abschätzen.

Folgende Vorschläge:
1.) versuche die internen Datenstrukturen so minimal wie möglich zu halten.
Beispiel:
<code memory="much">
open(BLABLA,'x.x');
my @inhalt = <BLABLA>; # schlecht, da der gesmate Dateiinhalt in ein Array gepackt wird
my $line;
foreach $line(@inhalt)
  {
  &machwasmit($line);
  }
</code>

<code memory="lesser">
open(BLABLA,'x.x');
while(<BLABLA>)
  {
  &machwasmit($_);
  }
</code>

2.) Versuche, die Lebensdauer von Strukturen auf ein Minimum zu beschränken
Einen Block um ein bestimmtes Stück Code hilft oft schon ungemein

<code memory="not as much as before">
{
open(BLABLA,'x.x');
my @inhalt = <BLABLA>; # schlecht, da der gesmate Dateiinhalt in ein Array gepackt wird
my $line;
foreach $line(@inhalt)
  {
  &machwasmit($line);
  }
}

ab hier gibts @inhalt nicht mehr

</code>

3.) Verwende alternativ zu 'use' 'require'.
Der hier wesentliche Unterschied ist, daß 'require' erst dann ausgeführt wird, wenn das Script auch den Code ausführt, während 'use' bereits zur Comiletime ausgeführt wird, unabhängig davon, ob das Modul im script jemals gebraucht wird.
Natürlich geht das nicht immer, aber wenn Du einige Deiner Module nicht immer brauchst, ist das eine Überlegung wert.

empfehlenswerte Lektüre dazu:
perldoc -f use
perldoc -f require

So, jetzt fältt mir nichts mehr ein, aber es gibt sicherlich noch einige andere Dinger, welche Dir helfen können, den Speicherbedarf des Scripts in Grenzen zu halten.
Ich hab vor kurzen auch das Problem gehabt, da hat das Script zu viele interne Strukturen angelegt, und dann brauchte es plötzlich im worst case 100+ MByte :-(

Ich hoffe, einigermaßen weitergeholfen zu haben.

Grüße
  Klaus