我有一個事件流,其中包含一些變量的值。這些值每秒都在變化。每個變量具有高限制,低限制和定義的閾值時間段。基於持有期的StreamInsight查詢
例如,假設變量1的上限= 95,下限= 5,閾值= 5秒。
因此,如果Variable1的值在閾值週期(5秒)內保持在95(上限)以上,那麼我們應該創建一個輸出事件。
我能夠創建查詢來檢查單個事件(如果他們已超過限制),但我不確定如何創建窗口查詢來檢查閾值期限是否被違反。
感謝,
我有一個事件流,其中包含一些變量的值。這些值每秒都在變化。每個變量具有高限制,低限制和定義的閾值時間段。基於持有期的StreamInsight查詢
例如,假設變量1的上限= 95,下限= 5,閾值= 5秒。
因此,如果Variable1的值在閾值週期(5秒)內保持在95(上限)以上,那麼我們應該創建一個輸出事件。
我能夠創建查詢來檢查單個事件(如果他們已超過限制),但我不確定如何創建窗口查詢來檢查閾值期限是否被違反。
感謝,
嗯,不是完全LINQ查詢,但應該做的伎倆:
public IEnumerable<IEnumerable<int>> GetWindows(IEnumerable<int> events)
{
while (events.Any())
{
events = events.SkipWhile(x => x > 5 && x < 95);
if (events.Any())
{
var isLow = events.First() <= 5;
var res = events.TakeWhile(x => isLow ? x <= 5 : x >= 95).ToList();
if (res.Count >= 5)
yield return res;
events = events.Skip(res.Count);
}
}
}
基本上是:
的,你可以使用它像這樣:
foreach (var window in GetWindows(events))
{
... raise event
}
注意:如果您的活動來作爲一個潛在的無限流以及活動窗口就變得非常大,那麼你贏了」讓窗口返回,直到完全消耗,這可能需要一些時間和內存。看到5個元素後,你可以打破TakeWhile
部分,然後屈服,然後簡單地跳過窗口的其餘部分。這取決於你想要做什麼。
這已經回答了在的StreamInsight論壇:http://social.msdn.microsoft.com/Forums/en-US/streaminsight/thread/f05d6748-b08e-498b-ac82-ce82203afd45
謝謝,我會研究它們。 –
謝謝,我終於創建了一個跳躍窗口,然後通過事件(窗口)中定義一個用戶定義的聚集,循環和檢查超出閾值的事件。 –