[Vienna-pm] anmerkungen ..

gooly at gmx.at gooly at gmx.at
Sat May 26 03:09:00 PDT 2007


Am Freitag, 25. Mai 2007 schrieb Peter J. Holzer:
> On 2007-05-25 18:09:18 +0200, gooly at gmx.at wrote:
>
> > foreach my $f ( liesFiles($FileDir) ) {
> >    open( SAVEOUT, "<&STDOUT" ) or warn "can't save stdout: $!\n";
> >    open( STDOUT, "<&", $SOCKET )  or warn "can't dup to
> > stdout:$!\n";
Ich hatte das aus dem Internet : copy + paste auf der Suche nach dubbing 
STDOUT auf einen Socket (fast alles betrifft immer nur Files). Hatte 
mich auch überrascht, aber dann dachte ich, was auf der einen Seite 
schreibt muss auf der anderen Seite lesen und hab's so übernommen.
>
> Das ist verwirrend. Du öffnest hier STDOUT zum Lesen. Funktioniert
> zwar trotzdem, aber IMHO nur deswegen, weil die Information das exec
> nicht übersteht (der darunter liegende Filedescriptor wird nur
> dupliziert und bleibt damit zum Lesen und Schreiben geöffnet).
>
> >    if ($f =~ /\.zip/) {
> >       system('unzip', '-p', $f );
> >    } else {
> >       system('cat', $f);
> >    }
> >    open( STDOUT, "<&SAVEOUT" ) or warn "can't restore stdout:
> > $!\n";
>
> Und da auch. Kannst Du danach noch auf STDOUT schreiben?
Ja, ich kriegte nur einen Warung. Aber zur Sicherheit alle drei 
open 'gehen mit' ">&"?
> > Also das mit unzip klappt.
> > Das mit cat hab ich noch nicht probiert. Frage dazu gäbe es zu
> > 'cat' einen bessere Alternative?
> > Kann man so wirklich im aufrufenden Perl-Programm den
> > Speicherverbrauch vermeiden, den zB ein
> > 	my $str;
> > 	open F, "<$file" or warn "$!\n";
> > 	read F, $str, (-s $file);
> > 	close(F);
> > 	...
> > von der Größe des Files verursachen würde?
>
> Ja. Die Daten gehen ja gar nie durch Dein Programm durch, zip bzw.
> cat gibt das direkt auf den Socket aus und terminiert dann. Selbst
> wenn zip bzw. cat das File als ganzes in den Speicher lesen würden,
> wäre der Speicher danach wieder frei, während das bei read F, $str,
> (-s $file); nicht notwendigerweise der Fall ist (Perl gibt Speicher
> ungern an das OS zurück - vielleicht braucht es ihn ja später
> wieder).
>
> Eine sinnvolle Perl-Variante wäre
>
> 	my $str;
> 	open F, "<", $file" or warn "$!\n";
> 	while (read F, $str, 0x1_0000) {
> 	    print $socket $str;
> 	}
> 	close(F);
> (auch "while (<F>) print }" würde funktionieren, braucht aber soviel
> Speicher wie die längste Zeile lang ist, was bei binären Files
> ziemlich unabschätzbar ist)
>
> Eine Methode, Memory-Leaks zu vermeiden, ist es zu forken und die
> eigentliche Arbeit im Kind-Prozess zu machen. 
Ja, aber dann hätt ich lauter forks in in forks in forks..
Das sind dannn  ifs in ifs in ifs.. So bleibt das Programm klein und 
übersichtlich und ich hab das Gefühl es ist auch ein bißchen schneller?

Aber Danke,
Calli


More information about the Vienna-pm mailing list