コード例 #1
0
 public AggregationResult(EntityMetadata metadata, AggregationConfig config, int keyIndex)
 {
     _metadata = metadata;
     _config = config;
     _keyIndex = keyIndex;
     _aggregators = config.Aggregators.Select(c => c.CreateAggregator()).ToArray();
     _groupResults = keyIndex < metadata.KeyCount ? new ConcurrentDictionary<int, AggregationResult>() : null;
 }
コード例 #2
0
ファイル: Program.cs プロジェクト: JeffreyZhao/ParallelAgg
        private static void Dump(IAggregationResult result, EntityMetadata metadata, AggregationConfig config, string filepath)
        {
            using (var writer = new StreamWriter(File.Create(filepath))) {
                writer.Write(String.Join("", Enumerable.Range(0, metadata.KeyCount).Select(i => "Key" + i + ",")));
                writer.WriteLine(String.Join(",", config.Aggregators.Select(a => "\"" + a.Name + "\"")));

                var keys = new int[metadata.KeyCount];
                Dump(writer, result, config, keys, 0);
            }
        }
コード例 #3
0
ファイル: Program.cs プロジェクト: JeffreyZhao/ParallelAgg
        private static void Dump(EntitySet set, EntityMetadata metadata, string filepath)
        {
            using (var writer = new StreamWriter(File.Create(filepath))) {
                writer.Write(String.Join("", Enumerable.Range(0, metadata.KeyCount).Select(i => "Key" + i + ",")));
                writer.WriteLine(String.Join(",", metadata.Properties.Select(p => p.Name)));

                foreach (var entity in set) {
            // ReSharper disable AccessToForEachVariableInClosure
                    writer.Write(String.Join("", Enumerable.Range(0, metadata.KeyCount).Select(i => entity.GetKey(i) + ",")));
                    writer.WriteLine(String.Join(",", metadata.Properties.Select(p => entity.Get(p).ToString(""))));
            // ReSharper restore AccessToForEachVariableInClosure
                }
            }
        }
コード例 #4
0
        public AggregationConfigTest()
        {
            var metadata = new EntityMetadata(1, 3);

            _property0 = metadata.Properties[0];
            _property1 = metadata.Properties[1];
            _property2 = metadata.Properties[2];

            _aggregatorConfig0 = new WgtAvgPropertyAggregatorConfig(0, _property0, _property1);
            _aggregatorConfig1 = new WgtAvgPropertyAggregatorConfig(1, _property1, _property2);
            _aggregatorConfig2 = new WgtAvgPropertyAggregatorConfig(2, _property0, _property2);

            _config = new AggregationConfig(metadata, new[] { _aggregatorConfig0, _aggregatorConfig1, _aggregatorConfig2 });
        }
コード例 #5
0
        public AggregationResult(EntityMetadata metadata, AggregationConfig config, int keyIndex)
        {
            _metadata = metadata;
            _config = config;
            _keyIndex = keyIndex;
            _aggregators = config.Aggregators.Select(c => c.CreateAggregator()).ToArray();
            _groupResults = keyIndex < metadata.KeyCount ? new ConcurrentDictionary<int, AggregationResult>() : null;

            _cts = new CancellationTokenSource();

            var executionOptions = new ExecutionDataflowBlockOptions {
                CancellationToken = _cts.Token,
                SingleProducerConstrained = true
            };

            _changeBlock = new ActionBlock<AggregationChange>((Action<AggregationChange>)ProcessChange, executionOptions);
        }
コード例 #6
0
ファイル: Program.cs プロジェクト: JeffreyZhao/ParallelAgg
        // ReSharper restore FunctionNeverReturns
        private static AggregationConfig CreateAggregationConfig(EntityMetadata metadata)
        {
            var aggregators = new List<PropertyAggregatorConfig>();

            foreach (var property in metadata.Properties) {
                aggregators.Add(new SumPropertyAggregatorConfig(aggregators.Count, property));
                aggregators.Add(new AvgPropertyAggregatorConfig(aggregators.Count, property));
            }

            foreach (var valueProperty in metadata.Properties) {
                foreach (var weightProperty in metadata.Properties) {
                    if (valueProperty == weightProperty) continue;

                    aggregators.Add(new WgtAvgPropertyAggregatorConfig(aggregators.Count, valueProperty, weightProperty));
                }
            }

            return new AggregationConfig(metadata, aggregators);
        }
コード例 #7
0
        public AggregationConfig(EntityMetadata metadata, IEnumerable<PropertyAggregatorConfig> aggregators)
        {
            var aggregatorList = aggregators.ToList();

            for (var i = 0; i < aggregatorList.Count; i++) {
                Debug.Assert(aggregatorList[i].Index == i);
            }

            _aggregatorsUpdateWith = new ReadOnlyCollection<PropertyAggregatorConfig>[metadata.Properties.Count];

            var aggregatorsGroupByProperty = aggregatorList
                .SelectMany(a => a.Properties.Select(p => Tuple.Create(p, a)))
                .GroupBy(t => t.Item1);

            foreach (var g in aggregatorsGroupByProperty) {
                var property = g.Key;
                Debug.Assert(metadata.Properties.Contains(property));

                _aggregatorsUpdateWith[property.Index] = new ReadOnlyCollection<PropertyAggregatorConfig>(g.Select(t => t.Item2).ToList());
            }

            _aggregators = new ReadOnlyCollection<PropertyAggregatorConfig>(aggregatorList);
        }
コード例 #8
0
 public IAggregationRoot Aggregate(EntitySet set, AggregationConfig config, EntityMetadata metadata)
 {
     return new AggregationRoot(set, config, metadata);
 }
コード例 #9
0
ファイル: Program.cs プロジェクト: JeffreyZhao/ParallelAgg
        static void Main(string[] args)
        {
            if (args.Length < 6) {
                Console.WriteLine("Usage:\tBenchmark.exe <s or p> <key number> <key size> <property number> <entity number> <iteration> <seed>");
                Console.WriteLine("Sample:\tBenchmark.exe s 5 3 10 100000 100 231347");
                return;
            }

            var isParallel = args[0] == "p";
            var keyCount = Int32.Parse(args[1]);
            var keySize = Int32.Parse(args[2]);
            var propertyCount = Int32.Parse(args[3]);
            var entityCount = Int32.Parse(args[4]);
            var iteration = Int32.Parse(args[5]);
            var seed = args.Length < 7 ? DateTime.Now.Millisecond : Int32.Parse(args[6]);

            Console.WriteLine("Parallel: " + isParallel);
            Console.WriteLine("Key number: " + keyCount);
            Console.WriteLine("Key size: " + keySize);
            Console.WriteLine("Property number: " + propertyCount);
            Console.WriteLine("Entity number: " + entityCount);
            Console.WriteLine("Iteration: " + iteration);
            Console.WriteLine("Seed: " + seed);
            Console.WriteLine();

            var random = new Random(seed);

            var metadata = new EntityMetadata(keyCount, propertyCount);
            var config = CreateAggregationConfig(metadata);

            var set = new EntitySet();
            foreach (var keys in InfiniteKeys(keyCount, keySize).Take(entityCount)) {
                set.Add(metadata.CreateEntity(keys));
            }

            Console.Write("Preparing...");

            var watch = new Stopwatch();
            watch.Start();

            var service = isParallel ? (IAggregationService)new ParallelAggregationService() : new SerialAggregationService();
            var root = service.Aggregate(set, config, metadata);
            root.Start();

            Console.WriteLine("Done");

            PrintMessage(iteration, 0);

            for (var i = 0; i < iteration; i++) {
                var num = 0;

                foreach (var entity in set) {
                    foreach (var property in metadata.Properties) {
                        entity.Set(property, (decimal)(random.NextDouble() * 1000000));
                    }

                    if (++num % 1000 == 0) {
                        PrintMessage(iteration, i + num * 1.0 / entityCount);
                    }
                }

                PrintMessage(iteration, i + 1);
            }

            Console.WriteLine();
            Console.WriteLine("Waiting for completion.");

            while (root.Running) {
                Thread.Sleep(100);
            }

            Console.WriteLine("Time: " + watch.Elapsed);

            var postfix = DateTime.Now.ToString("yyyyMMdd-HHmmss");
            Dump(set, metadata, "Source-" + postfix + ".csv");
            Dump(root.Result, metadata, config, "Result-" + postfix + ".csv");
        }
コード例 #10
0
 public AggregationRoot(EntitySet set, AggregationConfig config, EntityMetadata metadata)
     : base(set, config)
 {
     _result = new AggregationResult(metadata, config, 0);
 }