private static void OperateOnTrace(ManagerGroup group, TextReader input, bool generateData) { char[] separators1 = { '#', ';', '/' }; char[] separators2 = { ' ', '\t', ',' }; GroupAccessor accessor = new GroupAccessor(group, generateData); TraceParser parser = null; string line; while ((line = input.ReadLine()) != null) { long lineCount = Interlocked.Increment(ref processedLineCount); #if DEBUG if (lineCount >= 200000) break; if (lineCount % 5000 == 0) WriteCount(Console.Error, true); if (lineCount == 5608) lineCount = 5608; #endif string[] parts = line.Split(separators1, 2); line = parts[0].Trim(separators2); if (string.IsNullOrEmpty(line)) { string nlines = Regex.Match(parts[1], @"Lines: (\d+)").Groups[1].Value; if (!string.IsNullOrEmpty(nlines)) totalLineCount = long.Parse(nlines); continue; } parts = line.Split(separators2, StringSplitOptions.RemoveEmptyEntries); if (parser == null) parser = TraceParser.CreateParser(parts); uint pageid, length; AccessType type; parser.ParseLine(parts, out pageid, out length, out type); for (uint i = 0; i < length; i++) accessor.Access(new RWQuery(pageid + i, type)); } group.CascadeFlush(); }