簡體   English   中英

總價值需要很長時間

[英]Aggregate value takes very long time

我有一個大的15分鍾值的清單,這些值代表了一年。 我想將它們匯總成幾個小時。 我以非常簡單的方式做到這一點:

for (; from <= to; from = from.AddHours(1))
{
    List<DataPoint> valuesToAgregate = data.Where(x => x.TimeStamp >= from && x.TimeStamp < from.AddHours(1)).ToList();
    dailyInputData.Add(valuesToAgregate.Sum(x=>x.Val));

}

這樣需要花費大量時間,例如35k值需要30秒,是否有任何方法可以對其進行優化? 也許使用排序功能或一些如何添加索引到列表或使用分組方式代替for循環?

當然,如果您以前通過TimeStamp訂購列表,則可以更快地工作。 例:

var orderedData = data.OrderBy(item => item.TimeStamp).ToList();
int firstIndex = 0;
var from = orderedData.First().TimeStamp;
var to = orderedData.Last().TimeStamp;
while (from < to)
{
    var sum = 0;
    var newTo = from.AddHours(1);
    while (firstIndex < data.Count && orderedData[firstIndex].TimeStamp < newTo)
    {
        sum += orderedData[firstIndex].Val;
        ++firstIndex;
    }
    dailyInputData.Add(sum);
    from = from.AddHours(1);
 }
data = data.Sort(x=>x.TimeStamp);
int counter = 0;
var boundary = from.AddHours(1);
foreach(var d in data){
    if(d.TimeStamp > boundary){
        boundary = boundary.AddHours(1);
        counter = 0;
        dailyInputData.Add(counter);
    }
    ++counter;
}

這個問題在於邏輯

  1. 每次從頭到尾掃描列表以查找候選值(您的where子句)
  2. 候選值插入到另一個臨時列表
  3. 然后從頭到尾掃描臨時列表以計算總和

最快的方法:

  1. 排序列表
  2. 遍歷所有項目(如果它們屬於當前組),添加計數器,否則您跳至新組,刷新計數器以記錄值並重新開始

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM