My understanding of scope must be broken. I've got a small app with several subroutines, one of which reads in very large amounts of data into a hash. The data in question is a reference to a hash, averaging 25-30k keys. The values are themselves references to hashes containing seven or eight key/values. Two of those values average about 50 bytes, and the others average about ten.

This data is used only within the scope of said sub, and *should* go away once the scope of the sub has ended. Right? Watching the process with top, I can see it slowly eat up memory while going through an iteration of the sub (it is called 3 times), but not release anything once it proceeds to the next iteration.

I know there isn't really any way to "free()" memory in perl, since it does all the garbage collection, but shouldn't it release the now unused memory once the sub's scope has ended? With only three loops, this thing chews up almost 300MB of memory.

I'm using 'use vars ...' and 'use strict' to ensure that everything is correctly scoped. There are only two variables in global scope, one a short scalar and the other a three element array. Everything else is scoped within its given sub (via my). Is there anything else I can do?


In reply to memory usage woes by urufu-san

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.