예제 #1
0
        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();
        }