簡體   English   中英

Rx.NET 如何將 stream 數據緩沖為移動(滑動)window 無延遲?

[英]Rx.NET How do I buffer stream data as a moving (sliding) window without delay?

我正在使用 Rx.NET 庫連接到交易數據,我想做的是連續緩沖最后 100 秒的數據並每 2 秒分析一次。 我正在使用以下 Buffer 方法重載:

        tradeStream
            .Buffer(TimeSpan.FromSeconds(100), TimeSpan.FromSeconds(2))
            .Subscribe(data =>
            {
                //...
            });

現在的問題是它作為 100 秒緩沖區工作 + 它等待 2 秒。 有沒有辦法以一定的間隔立即拍攝最后 100 秒的“快照”?

聽起來您為此需要內置運算符Window 有一個重載需要兩個TimeSpan

IObservable<IObservable<Trade>> query =
    tradeStream
        .Window(TimeSpan.FromSeconds(100.0), TimeSpan.FromSeconds(2.0));

這樣就開始了一個新的 observable,它每 2 秒持續 100 秒。

您可以考慮使用Replay運算符將數據緩沖指定的持續時間,並使用Observable.Interval方法在每個間隔發出緩沖數據。 要完成生成的序列,您可以使用TakeUntil運算符。 下面是一個可能的實現。

/// <summary>
/// Emits a list every interval that contains all the currently buffered elements.
/// </summary>
public static IObservable<IList<TSource>> BufferHistorical<TSource>(
    this IObservable<TSource> source,
    TimeSpan interval, TimeSpan replayDuration)
{
    ArgumentNullException.ThrowIfNull(source);
    if (interval < TimeSpan.Zero)
        throw new ArgumentOutOfRangeException(nameof(interval));
    if (replayDuration < TimeSpan.Zero)
        throw new ArgumentOutOfRangeException(nameof(replayDuration));

    return source.Replay(replayed =>
    {
        return Observable
            .Interval(interval)
            .SelectMany(_ => replayed
                .TakeUntil(Observable.Return(Unit.Default, Scheduler.CurrentThread))
                .ToList())
            .TakeUntil(replayed.LastOrDefaultAsync());
    }, replayDuration, Scheduler.Immediate);
}

使用示例:

tradeStream
    .BufferHistorical(TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(100))
    .Subscribe(data =>
    {
        //...
    });

暫無
暫無

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

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