Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number
 
PerlMonks  

Re^15: Memory leak question

by SBECK (Pilgrim)
on Oct 06, 2010 at 19:06 UTC ( #863854=note: print w/ replies, xml ) Need Help??


in reply to Re^14: Memory leak question
in thread Memory leak question

I was able to reproduce the leak in a trivial script, and I think that I'm down to the most basic illustration.

$a = '(?<a>\d)'; $b = '(?<b>\d)'; $rx = qr/(?:${a}${b}|${a}:${b})/; #$string = "12"; $string = "1:2"; while (1) { $string =~ $rx; @tmp = @+{qw(a b)}; }
This leaks.

If I modify $rx to include only one of the two choices, it doesn't leak. If I plug in a string which matches the first option (i.e. use the $string = "12" line), it doesn't leak. And if you comment out the @tmp = @+ line so you don't access %+, it doesn't leak.

At this point, I guess I no longer believe that it is a Date::Manip problem. In other words, I don't think the above script is buggy... I think it points out a bug in perl itself. If you agree, I think I'll pass it on as a perl bug.

Final (I hope) comment?


Comment on Re^15: Memory leak question
Download Code
Re^16: Memory leak question
by BrowserUk (Pope) on Oct 06, 2010 at 19:40 UTC
    If you agree, I think I'll pass it on as a perl bug.

    Yes, I absolutely agree. And your example demos the bug perfectly.

    Nice to know my instincts weren't too far off--I always suspect new features first. But try as hard as I might I couldn't arrive at the simple demo that leaked. Congratulations on that.

    The downside is you'll have to wait a while for the fix, but at least you now know.


    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.
      Filed as perlbug #78266
Re^16: Memory leak question
by BrowserUk (Pope) on Oct 06, 2010 at 20:20 UTC

    One final thought :)

    There is another way of doing "named captures", without using the construct or %+ or %-. It's a bit um ... obscure, and may be slower, but it might allow you to workaround the problem in the interim without radically altering your existing code.

    #! perl -slw use strict; use re qw[ eval ]; use Data::Dump qw[ pp ]; my $reY = '(\d{4})(?{ $match{ y } = $^N })';; my $reM = '(\d{2})(?{ $match{ m } = $^N })';; my $reD = '(\d{2})(?{ $match{ d } = $^N })';; my $reH = '(\d{2})(?{ $match{ h } = $^N })';; my $reMN = '(\d{2})(?{ $match{ mn } = $^N })';; my $reS = '(\d{2})(?{ $match{ s } = $^N })';; my $reDT = "$reY-$reM-$reD\\s+$reH:$reMN:$reS"; our %match = (); '2010-10-06 20:55:31' =~ $reDT; pp \%match;; __END__ c:\test>junk57.pl { d => "06", h => 20, "m" => 10, mn => 55, "s" => 31, "y" => 2010 }
    Or better still, cut out the middleman and put the captures straight into the names variables themselves (I wish named captures worked this way full stop) :
    #! perl -slw use strict; use re qw[ eval ]; use Data::Dump qw[ pp ]; my $reY = '(\d{4})(?{ $y = $^N })';; my $reM = '(\d{2})(?{ $m = $^N })';; my $reD = '(\d{2})(?{ $d = $^N })';; my $reH = '(\d{2})(?{ $h = $^N })';; my $reMN = '(\d{2})(?{ $mn = $^N })';; my $reS = '(\d{2})(?{ $s = $^N })';; my $reDT = "$reY-$reM-$reD\\s+$reH:$reMN:$reS"; local our( $y, $m, $d, $h, $mn, $s ); '2010-10-06 20:55:31' =~ $reDT; print "$y, $m, $d, $h, $mn, $s"; __END__ c:\test>junk57.pl 2010, 10, 06, 20, 55, 31

    Note: The variables referenced inside the (?{ code }) blocks have to be global, but judicious use of local and our makes it reasonably convenient. Also, I've had iffy results using qr// with this. Never really understood why.

    I realise that it would be considerable work to modify all your regex generators to use this method, but hey!

    You can always knock up a few regex to do it for you ;)


    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.
      Thanks for the suggestion. I actually already tested this type of regexp (it was suggested in a previous question I posted about named captures: http://perlmonks.org/?node_id=810388). Unfortunately, the relatively simple tests I benchmarked weren't "a little slower". They were 7x slower!

      So, unfortunately, I think I'm going to have to leave the current code in place meaning that there will be a problem for anyone using Date::Manip in a persistant program. Sooner or later, the problem will be fixed. I'm going to add a note to this affect to the documentation, but for now, I think that's going to be the extent of it.

      Thanks again for an incredibly educational and fun (and frustrating... but not due to you) conversation!
        Unfortunately, the relatively simple tests I benchmarked weren't "a little slower". They were 7x slower!

        Ouch! I can see how that it would be disastrous to expend all the effort of converting only to find those monsters running like they were on 1990's hardware :)

        Thanks again for an incredibly educational and fun (and frustrating... but not due to you) conversation!

        As always with the interesting problems. I probably got as much out of the exercise as you did. That's what keeps me coming back to this place. Moi petites cellules grises need stimulation otherwise they atrophy. Fast!


        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.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://863854]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others chilling in the Monastery: (7)
As of 2014-12-25 01:53 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    Is guessing a good strategy for surviving in the IT business?





    Results (159 votes), past polls