Zna się ktoś na prel'u ?
Radoslaw Zielinski
radek w karnet.pl
Nie, 12 Gru 2004, 23:54:09 CET
Przemysław Iskra <sparky w servek.sparky.homelinux.org> [12-12-2004 15:26]:
[...]
> while (<F_IN>) {
> print "$_";
Tu nadpisałeś $_...
> my $specdir="/home/users/sparky/pld-cvs/SPECS";
> opendir DIR, "$specdir";
> foreach( sort readdir DIR ) {
...które wcześniej użyte zostało tu. $_ jest zmienną globalną (o ile
nie podasz konkretnej przestrzeni nazw, np. $Foo::_).
[...]
> pod koniec działania program ten zajmuje ~30MB pamięci (przy większym
> pliku więcej)
> to się robi jakaś historia zmiennych czy coś ?
Nie, to jakiś błąd przy zliczaniu referencji. Zgłoś przez perlbug;
że jest spora szansa, że ktoś się tym zajmie (niedawno dodawali
optymalizację foreach reverse .., później ktoś poprawiał, a to wygląda na
powiązane... ale tylko na pierwszy rzut oka, bo 5.8.3 też jest podatny).
Załączam nieco prostszy test-case. Wywołanie:
$ ./leak.pl 50000 >/dev/null
PID TTY STAT TIME MAJFL TRS DRS RSS %MEM COMMAND
3101 pts/1 R+ 0:00 0 8 5167 1440 0.5 /usr/bi
3101 pts/1 S+ 0:00 0 8 7999 4244 1.6 /usr/bi
3101 pts/1 S+ 0:01 0 8 14075 10336 4.0 /usr/b
3101 pts/1 R+ 0:03 0 8 24239 20412 7.9 /usr/b
3101 pts/1 S+ 0:03 0 8 8131 4408 1.7 /usr/bi
Jeśli chcesz, żeby Ci ,,po prostu działało'', to nie używaj $_
w funkcjach, które mogą być wywoływane w pętlach (albo "local *_"
na początku). "while (my $coś = <F_IN>)" nie jest aż tak długie, a
minimalnie szybsze. Zamiana "print while" na "map print," też załatwia
sprawę (map i grep robią "local *_").
--
Radosław Zieliński <radek w karnet.pl>
[ GPG key: http://radek.karnet.pl/ ]
-------------- następna część ---------
Załącznik, który nie był tekstem został usunięty...
Name: nie znany
Type: application/pgp-signature
Size: 189 bytes
Desc: nie znany
Url : /mailman/pipermail/pld-devel-pl/attachments/20041212/08a417e7/attachment.bin
Więcej informacji o liście dyskusyjnej pld-devel-pl