Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?

Re: regex on gigabyte string

by dave_the_m (Prior)
on Jan 26, 2013 at 17:46 UTC ( #1015521=note: print w/replies, xml ) Need Help??

in reply to regex on gigabyte string

The regex engine is largely 32-bit; in particular, the indices of captures within a string are stored as 32-bit signed values, so they can't do captures more than 2Gb into a string.


Replies are listed 'Best First'.
Re^2: regex on gigabyte string (31 bits)
by tye (Sage) on Jan 26, 2013 at 19:11 UTC

    Worse than that, I've seen tools explicitly dump something like (...)*? in a regex as something very close to (...){0,32766}?, because repetition only supported 15 bits, not 32, at least in some cases (but maybe that isn't true of modern versions of Perl). But it also seemed like those tools didn't always do such. So I'm not sure how often that limitation applies.

    But it is easy to find the breaking point for this particular regex:

    $ perl -del DB<1> x 0+( () = join('','<c>','x'x(1<<30),'</c>') =~ m{<c.*?/c>}g ) 0 1 DB<2> x 0+( () = join('','<c>','x'x(1<<31),'</c>') =~ m{<c.*?/c>}g ) 0 0 DB<3> x 0+( () = join('','<c>','x'x((1<<31)-8),'</c>') =~ m{<c.*?/c> +}g ) 0 1 DB<4> x 0+( () = join('','<c>','x'x((1<<31)-7),'</c>') =~ m{<c.*?/c> +}g ) 0 0

    So (my version of) Perl can't deal with a capture string of more than 2**31-1 characters. And:

    $ perl -del DB<2> x 0+( () = join('',('<c>','x'x((1<<30)-10),'</c>')x2) =~ m{<c. +*?/c>}g ) 0 2 DB<1> x 0+( () = join('',('<c>','x'x((1<<30)-10),'</c>')x3) =~ m{<c. +*?/c>}g ) 0 0

    Surprisingly, it fails to even find the first match if there is a match beyond the 2**31-1 character position? Even trying to iterate to that point doesn't really help (perhaps .*? backtracks?):

    $ perl -del DB<1> $x = join('',('<c>','x'x((1<<30)-10),'</c>')x2); while( $x =~ +m{<c.*?/c>}g ) { print pos($x), $/ } 1073741821 2147483642 DB<1> $x = join('',('<c>','x'x((1<<30)-10),'</c>')x3); while( $x =~ +m{<c.*?/c>}g ) { print pos($x), $/ } DB<2>

    So one needs to deal with the string in reasonably-sized chunks. Which makes me wonder which XML-parsing modules manage to get that right. Their test suites should include a tag with a 4GB attribute value (with an escaped character at the end). :)

    - tye        

Re^2: regex on gigabyte string
by focusonz (Initiate) on Jan 26, 2013 at 19:15 UTC

    There you go! That is the shortcoming.

    keywords: PERL 64bit(x54)and 32bit(x86) MAXIMUM STRING SIZE REGEX ENGINE 2GB per dave_the_m and focusonz test


    keywords: PERL MAXIMUM STRING SIZE 16GB 64bit(x64) ALSO IS Windows 7 Home Premium X64 LIMIT


Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1015521]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (8)
As of 2017-02-28 02:31 GMT
Find Nodes?
    Voting Booth?
    Before electricity was invented, what was the Electric Eel called?

    Results (395 votes). Check out past polls.