in reply to Re: cleaning up memory after closing files on MACOSX
in thread cleaning up memory after closing files on MACOSX

you have it almost right, perl running on most moderen OS will free memory, the OS will try to absorb the freed memory. The issue comes into when and how the memory was allocated from the OS, if it was taken in in small chunks (like durring a loop where you grow an array wiothout predefing how large it would be) and is freed the OS may have problems taking it back and making it available. If the memory was allocated in a large chunk it has a batter chance to be freed and taken back into the pool after usage. On the plus side perl will reuse allocated memory when it can so this can end up saving time. If the OP is seeing memory continue to grow every time he does a merge file he may want to look for a data structure that is not going out of scope and getting freed between each loop, this may be a closure issue or just a bug where you are using a global var instead of a locally scoped one that clears itself when you leave the scope.

-Waswas
  • Comment on Re: Re: cleaning up memory after closing files on MACOSX

Replies are listed 'Best First'.
Re: Re: Re: cleaning up memory after closing files on MACOSX
by sgifford (Prior) on Aug 28, 2003 at 04:41 UTC
    That's not quite right either. Most modern OS's have facilities for returning memory to the system (on UNIX, it's usually mmap(2)), but most software, including Perl, doesn't make good use of them. See, for example:
    #!/usr/bin/perl use constant SLEEP => 20; warn "Starting\n"; my @arr = (1..1_000_000); warn "Allocated\n"; sleep(SLEEP); undef @arr; warn "Freed.\n"; sleep(SLEEP);
    Clearly most of the memory allocated will be in contiguous blocks, and could be reclaimed by the OS, but if you watch top you'll see that almost none ever is.
      perl's malloc/free keeps the memory for itself; gnu's malloc/free may return large chunks of freed memory to the linux kernel, and the kernel usually does not absorb it instantly the cleanup is on a cycle so you may have to wait way longer than 20 seconds for the release to take effect. Mac's compiler frees to the OS as well. so it really depends what system and malloc you use when compiling perl -- however his bprogram gaining that much memory usage points to perl not reusung the pool it has and growing vars not a freeing issue.

      -Waswas