regex.d(6050): not enough preallocated memory

Dmitry Olshansky dmitry.olsh at gmail.com
Tue Jun 5 13:52:33 PDT 2012


On 06.06.2012 0:25, Paul wrote:
> I am trying to see if all regex matches in one file are present in
> another file.
> The code works; but, part way through the nested foreach(s) I get the
> error listed in the subject line. I would think this error would come up
> when the Regex expressions were executed not when I'm iterating through
> the resultant matches.
>
To get next match engine is run again, then again for the next match and 
so on - it's lazy evaluation at it's finest (how knows maybe you'll 
break loop half-way through). Obviously it either looses some RAM in 
between calls or it just bugs out when reaches some specific text.

> Is there a better way to do this or can I just allocate more memory?
> Thanks.

Looks like you found a bug. Meaning that I probably miscalculated 
required amount of RAM or lose some free list nodes between calls.

File a bug report, keep in mind that I need the data to reproduce it.

Untill I figure it out, I recommend to fallback on bmatch function that 
is slower and in general unbound on used memory but should work.

Another idea - try to modify one of regexes insignificantly, so that 
they don't reuse data structures internally (just in case it has to do 
with that).

> // Execute Regex expressions
> auto uniCapturesOld = match(uniFileOld, regex(r"^NAME =
> (?P<comp>[a-zA-Z0-9_]+):*(?P<blk>[a-zA-Z0-9_]*)","gm"));
> auto uniCapturesNew = match(uniFileNew, regex(r"^NAME =
> (?P<comp>[a-zA-Z0-9_]+):*(?P<blk>[a-zA-Z0-9_]*)","gm"));


>
> // Iterate through match collections to see if both files contain the
> same matches.
> foreach (matchOld; uniCapturesOld) {
> cntOld++;
> found = false;
> foreach (matchNew; uniCapturesNew) {
> cntNew++;
> // Following line is for troublshooting.
> writeln(cntOld," ",cntNew," ",matchOld.hit," ",matchNew.hit);
> if (matchOld.hit == matchNew.hit) {found=true;break;}}
> if (!found) writeln(cntNF++," ",matchOld.hit," not found);}
>


-- 
Dmitry Olshansky


More information about the Digitalmars-d-learn mailing list