in reply to Oh where has my memory gone?

I'm even using undef when I'm done with variables

Don't bother using undef to free memory, just let your variables go out of scope and let Perl's garbage collector work for you.

For instance, you should declare my @list and my @new_list inside the manager block.

Followup: better yet, don't use the arrays. Just iterate over the directory handle.

use strict; use warnings; my $thr; # ... sub manager() { local $| = 1; while (print '.') { opendir(my $dir_handle, './acc'); FILE: while (my $file = readdir($dir_handle) ) { # or use /.dat/ if that's what you meant next FILE if $file !~ /[.]dat$/; open(my $reader, '<', "./acc/$file"); my @items = <$reader>; close($reader); $thr = threads->new(\&initiator, @items); unlink("./acc/$file"); } close($dir_handle); sleep(2); } }

Replies are listed 'Best First'.
Re^2: Oh where has my memory gone?
by perrin (Chancellor) on Jun 09, 2008 at 19:50 UTC
    Although I agree with the advice, Perl's behavior is actually more complicated. Sometimes undef does free memory.
Re^2: Oh where has my memory gone?
by Anonymous Monk on Jun 09, 2008 at 19:26 UTC
    Hello, THANK YOU SO MUCH FOR THE QUICK REPLY AND YES I'M YELLING IT! But could I also just do...
    sub manager(){ while(1){ #same as before... } }
    To reduce memory usage? With or without the need for undef?
      Yes that'll do the same as BrowserUK's quick solution: replace the endless recursion with a loop.

      Perl doesn't treat tail recursion as speacial, so it's still bad. As in the original code.

      Yes. Lose the undefs, they are doing nothing.