in reply to Re: Hash memory leak: posible scope issue?
in thread Hash memory leak: posible scope issue?

Yes, for testing I combined the test-case with the code for simplicity. Should I separate them?

"Well done is better than well said." - Benjamin Franklin

  • Comment on Re^2: Hash memory leak: posible scope issue?

Replies are listed 'Best First'.
Re^3: Hash memory leak: posible scope issue?
by BrowserUk (Patriarch) on Jan 03, 2012 at 20:04 UTC
    Should I separate them?

    No. My thought was that the only way I could see of explaining your results is that your initial declaration:

    our %RCache = (); keys( %RCache ) = 1020;

    was in a different package to your reset subroutine:

    sub CheckMemoryUsage { our %RCache; ...

    and that because you redeclared the hash locally to the reset sub, you were manipulating two different hashes. But that doesn't make sense as the ENTER size would then be zero.

    I've been unable to reproduce your results in a simplified test:

    #! perl -slw use strict; use Devel::Size qw[ total_size ]; our %cache; keys %cache = 1020; sub resetCache { our %cache; printf "Before: keys: %u size: %u\n", scalar keys %cache, total_size( \%cache ); %cache = (); printf "After: keys: %u size: %u\n", scalar keys %cache, total_size( \%cache ); } while( 1 ) { $cache{ int( rand 2**32 ) } = chr(0) x 2048; if( keys %cache >8192 ) { resetCache(); } } __END__ C:\test>junk29 Before: keys: 8193 size: 17727631 After: keys: 0 size: 131144 Before: keys: 8193 size: 17727579 After: keys: 0 size: 131144 Before: keys: 8193 size: 17727590 After: keys: 0 size: 131144 Before: keys: 8193 size: 17727614 After: keys: 0 size: 131144 Before: keys: 8193 size: 17727556 After: keys: 0 size: 131144 Before: keys: 8193 size: 17727578 After: keys: 0 size: 131144 Before: keys: 8193 size: 17727621 After: keys: 0 size: 131144 ...

    And the question was me speculating about possible scenarios.


    With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.

    The start of some sanity?

      I did the same thing by copying the script and removing all that was not related to %RCache. I could run it 25 times more than the calls in the script and 'no memory leak'. It seems that something I'm doing is making %RCache the victim of another part of the script.

      I did remove all I/O. In the actual code, the first time I go to the resetCache subroutine is more the 3 minutes into the run, while I could run the reduced script in less than 2 seconds. So there's a lot going on, but it has to be my code.

      I'm using 'sysseek/sysread/syswrite' because of having boundary problems with 'seek/read/print' or mainly 'print', but I have been pleased with the performance of the 'sys*' functions. I'll try to remove less code and see what happens.

      Thank you for thinking of the packages. I'll keep you informed.

      "Well done is better than well said." - Benjamin Franklin

        Another thought. You're not running this in a mod_perl or other 'persistant perl' environment are you?


        With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
        Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
        "Science is about questioning the status quo. Questioning authority".
        In the absence of evidence, opinion is indistinguishable from prejudice.

        The start of some sanity?