Tested it locally with 1000 sites and reduced time to generate report from 60 seconds to about 4 seconds (with profiling enabled). Problem was it called millions of times (3 periods * 1000 sites * 1000 sites) all segments etc. as there was a bug when getting the string for the done flag.
For each of those 1000 sites we called again 1000 times getDoneString... which results in 1mio calls for each period. When user has 2000 sites it was likely 12 mio calls. Now it should call it only a few thousand times.
Very good find