Ejemplo n.º 1
0
        public MapReduceActor
        (
            Action <IActor, TData> senderKV,
            MapAction <TKeyMap, TValueMap> mapKV,
            ReduceFunction <TKeyReduce, TValueReduce> reduceKV,
            IActor outputActor
        ) : base()
        {
            // start reduce
            var bhvStart = new Behavior <TData>(d =>
            {
                fActiveMap++;
                senderKV(this, d);
            });

            // receive data to process
            var bhvInput = new Behavior <TKeyMap, TValueMap>(
                (k, v) =>
            {
                // parse data
                var map = new MapActor <TKeyMap, TValueMap>(this, mapKV);
                fActiveMap++;
                map.SendMessage((IActor)this, k, v);
            }
                );

            // end parse
            var bhvEndParse = new Behavior <TData, IActor>((d, a) => fActiveMap--);

            // receive from Map, index
            var bhvMap2Index = new Behavior <TKeyReduce, TValueReduce>
                               (
                (k, v) =>
            {
                if (!fDict.TryGetValue(k, out List <TValueReduce> someValue))
                {
                    fDict[k] = new List <TValueReduce>();
                }
                fDict[k].Add(v);
            }
                               );

            // receive end of job from Map, go to reduce
            var bhvMap2EndOfJov = new Behavior <MapActor <TKeyMap, TValueMap> >
                                  (
                (a) =>
            {
                fActiveMap--;
                if (fActiveMap <= 0)
                {
                    // launch reduce
                    foreach (var item in fDict)
                    {
                        var red = new ReduceActor <TKeyReduce, TValueReduce>(this, reduceKV);
                        red.SendMessage(item.Key, item.Value.AsEnumerable());
                    }
                }
            }
                                  );

            // receive from Reduce, send to output
            var bhvReduceToOutput = new Behavior <ReduceActor <TKeyReduce, TValueReduce>, TKeyReduce, TValueReduce>
                                    (
                (r, k, v) => outputActor.SendMessage(k, v)
                                    );

            Behaviors bhvs = new Behaviors();

            bhvs.AddBehavior(bhvStart);
            bhvs.AddBehavior(bhvEndParse);
            bhvs.AddBehavior(bhvInput);
            bhvs.AddBehavior(bhvMap2Index);
            bhvs.AddBehavior(bhvMap2EndOfJov);
            bhvs.AddBehavior(bhvReduceToOutput);
            Become(bhvs);
        }
 public MultiSourceAttribute(ReduceFunction reduce = ReduceFunction.Average)
 {
     this.ReduceType = reduce;
 }
Ejemplo n.º 3
0
 public ReduceActor(IActor sender, ReduceFunction <TKey, TValue> reduceFunction) : base()
 {
     fReduceFunction = reduceFunction;
     fSender         = sender;
     Become(new Behavior <TKey, IEnumerable <TValue> >(DoReduceFunction));
 }
 public MapReduceProgram(MapFunction mapFunction, ReduceFunction reduceFunction)
 {
     _map    = mapFunction;
     _reduce = reduceFunction;
 }