protected async static Task <Array> FetchRawDataAsync(IDataStorage storage, DataDomain dataDomain, string variable) { Stopwatch dataRequestSw = Stopwatch.StartNew(); ts.TraceEvent(TraceEventType.Start, 2, "Extracting data from storage"); var data = await storage.GetDataAsync(variable, dataDomain.Origin, null, dataDomain.Shape); dataRequestSw.Stop(); long sizeMb = (data.Length * Marshal.SizeOf(data.GetType().GetElementType())) / 1024 / 1024; ts.TraceEvent(TraceEventType.Stop, 2, string.Format("Data extracted in {0}. {1}MB extracted", dataRequestSw.Elapsed, sizeMb)); return(data); }
/// <summary> /// The method producing double array of mean values from the sequence of cells /// </summary> /// <param name="variable">A variable name (data source scope) to get the mean values for</param> /// <param name="cells">A sequence of cells to get the mean values for</param> /// <returns></returns> public async Task <double[]> AggregateCellsBatchAsync(IEnumerable <ICellRequest> cells) { ICellRequest first = cells.FirstOrDefault(); if (first == null) { return(new double[0]); } else { var cellArray = cells.ToArray(); var variable = first.VariableName; DataDomain dataDomain = CalcDataDomain(cellArray, this.timeBBCalc, this.latBBcalc, this.lonBBcalc); if (dataDomain == null) { return(Enumerable.Repeat(double.NaN, cellArray.Length).ToArray()); } Array data = await FetchRawDataAsync(dataStorage, dataDomain, variable); double[] result = arrayAggregator.Aggregate(variable, data, dataDomain, cellArray).ToArray(); return(result); } }