突发数据的无功累积

问题描述 投票:0回答:1

问题:有大量数字值。值以突发方式推送,因此100个值可以彼此非常接近(按时间顺序),例如每5-10毫秒,然后可能停止一会儿,然后又可以突发。其想法是显示累积值(总和)最多500毫秒的窗口数。

[我的第一次尝试是使用Buffer(500ms),但是这会导致事件(每500毫秒)不断地被泵送(总和为os 0,总和为0),可以通过空缓冲区进行过滤来解决,但是我确实希望完全避免这种情况,只在经过一段时间的“静默”后实际推入一个值后才打开缓冲。

附加限制:实现是UniRx,它不包含所有Rx运算符,尤其是Window(我怀疑在这种情况下可能有用),因此解决方案仅限于包括Buffer在内的基本运算符。

reactive-programming system.reactive unirx
1个回答
1
投票

因为您只想要总和,所以使用Buffer是过大的。我们可以运行ScanAggregation

  var burstSum =
    source
        .Scan(0, (acc, current) => acc + current)
        .Throttle(TimeSpan.FromMilliseconds(500))
        .Take(1)
        .Repeat();

这将开始累积总和的流,直到该流空闲至少500ms。

但是如果我们想至少每个时间段都发射一次,我们必须走不同的道路。我们做出两个假设:

  1. 元素之间的时间间隔之和应等于第一个元素与最后一个元素之间的时间间隔。
  2. [Throttle将在流完成时释放最后一个值。

    source
        .TimeInterval()
        .Scan((acc, cur) => new TimeInterval<int>(acc.Value + cur.Value, acc.Interval + cur.Interval))
        .TakeWhile(acc => acc.Interval <= TimeSpan.FromMilliseconds(500))
        .Throttle(TimeSpan.FromMilliseconds(500))
        .Select(acc => acc.Value)
        .Take(1)
        .Repeat();
    
© www.soinside.com 2019 - 2024. All rights reserved.