Schrift
[thread]12265[/thread]

"Ungeschickte" sort-Subroutine spammt Speicher voll..

Leser: 1


<< >> 3 Einträge, 1 Seite
FoolAck
 2008-07-29 01:39
#112839 #112839
User since
2008-05-02
69 Artikel
BenutzerIn
[default_avatar]
Ich wollte eben stumpf die Ausgabe von "ls -l" nach Größe anordnen (ja, ich weiß. "man ls". Die "-S" Option unzo...) und hab dabei die sort-Sub ziemlich versaut, was in einem üblen Speicherzugespamme resultierte.

Hier der (inzwischen) korrigierte Einzeiler:
Code: (dl )
ls -l|perl -ane 'push @lines, [@F]; END { print map { "@$_\n" } sort {$a->[4] <=> $b->[4]}  @lines; }'


Hier der pöhse Einzeiler, der meinen RAM zumüllt:
Code: (dl )
ls -l|perl -ane 'push @lines, [@F]; END { print sort {$lines[$a][4] <=> $lines[$b][4]} @lines; }'

Hm. Ist natürlich offensichtlich falsch. $a ist in dem Fall ja eine Arrayreferenz (genauso wie $b), aber warum (und mit was) wird der Speicher da so übelst vollgepackt?

Quote
This is perl, v5.8.8 built for i486-linux-gnu-thread-multi


Mir macht das tendenziell ein wenig Angst. (Innerhalb einer Sekunde oder so mehrere 100mb belegt (halt, bis kein Speicher mehr frei ist....).)
Die "kreative" Sort-Subroutine ist übrigens ein Resultat von Schlafdeprivation, also nicht lachen. :(
moritz
 2008-07-29 01:45
#112841 #112841
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
FoolAck+2008-07-28 23:39:00--
Hier der pöhse Einzeiler, der meinen RAM zumüllt:
Code: (dl )
ls -l|perl -ane 'push @lines, [@F]; END { print sort {$lines[$a][4] <=> $lines[$b][4]} @lines; }'

Hm. Ist natürlich offensichtlich falsch. $a ist in dem Fall ja eine Arrayreferenz (genauso wie $b), aber warum (und mit was) wird der Speicher da so übelst vollgepackt?


$a ist eine Referenz, und die wird als Array-Index, also als Integer benutzt. Mit vermutlich ziemlich großen Werten.
Dadurch, dass du dahinter noch einen Subscript-Operator hast (also das 4 in eckigen Klammern) greift die Autovivification, d.h. an der Stelle
Code: (dl )
$lines[$a]
wird ein neues Array erzeugt - und Speicher für alle Elemente bis dahin allokiert.
FoolAck
 2008-07-29 02:00
#112842 #112842
User since
2008-05-02
69 Artikel
BenutzerIn
[default_avatar]
Quote
Autovivification

Sowas hab ich mir fast schon gedacht, aber mir war nicht klar, dass eine Referenz überhaupt als Arrayindex verwendet werden kann. Also ich seh ja immer nur die stringifizierte Version von Referenzen ( ARRAY(0x8152c28) ). Aber laut
Code: (dl )
perl -e '$foo += []; print $foo'
kann man Speicheradressen wohl auch einfach wie normale Zahlen verwenden. (Sind ja auch nur Hexadezimalzahlen.)
Danke für die fixe Aufklärung.
<< >> 3 Einträge, 1 Seite



View all threads created 2008-07-29 01:39.