Using lazy code to process large files

Martin DraĊĦar via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Aug 2 05:59:19 PDT 2017


Dne 2.8.2017 v 14:45 Steven Schveighoffer via Digitalmars-d-learn napsal(a):

> The problem is that you are 2 ranges deep when you apply splitter. The
> result of the map is a range of ranges.
> 
> Then when you apply stringStripleft, you are applying to the map result,
> not the splitter result.
> 
> What you need is to bury the action on each string into the map:
> 
> .map!(a => a.splitter(",").map!(stringStripLeft).join(","))
> 
> The internal map is because stripLeft doesn't take a range of strings
> (the result of splitter), it takes a range of dchar (which is each
> element of splitter). So you use map to apply the function to every
> element.
> 
> Disclaimer: I haven't tested to see this works, but I think it should.
> 
> Note that I have forwarded your call to join, even though this actually
> is not lazy, it builds a string out of it (and actually probably a
> dstring). Use joiner to do it truly lazily.
> 
> I will also note that the result is not going to look like what you
> think, as outputting a range looks like this: [element, element,
> element, ...]
> 
> You could potentially output like this:
> 
> output.write(result.joiner("\n"));
> 
> Which I think will work. Again, no testing.
> 
> I wouldn't expect good performance from this, as there is auto-decoding
> all over the place.
> 
> -Steve

Thanks Steven for the explanation. Just to clarify - what would be
needed to avoid auto-decoding in this case? Process it all as an arrays,
using byChunk to read it, etc?

@kdevel: Thank you for your solution as well.

Martin


More information about the Digitalmars-d-learn mailing list