Rx java 有效地将大量rx观测值一起采样

Rx java 有效地将大量rx观测值一起采样,rx-java,Rx Java,我有大量的可观测数据,并希望将它们聚合为一个值。他们以高频率更新,并认为必须使用“有损”背压策略。我选择了样本,但任何类似的都可以接受我想知道最有效的(性能和/或资源方面的)方法是什么。两种方法显而易见: val列表:可观察[可观察[双]]=??? val f:(双精度,双精度)=>双精度=??? (可观察组合测试列表)样本(1秒)减少f 或者 CombineTest(列表映射(u样本(1秒))减少f 我认为公平地说,这是一个非常常见的用例。为了减少抽象性,假设我有许多连续发射数据的温度传感

我有大量的可观测数据,并希望将它们聚合为一个值。他们以高频率更新,并认为必须使用“有损”背压策略。我选择了
样本
,但任何类似的都可以接受我想知道最有效的(性能和/或资源方面的)方法是什么。两种方法显而易见:

val列表:可观察[可观察[双]]=???
val f:(双精度,双精度)=>双精度=???
(可观察组合测试列表)样本(1秒)减少f
或者

CombineTest(列表映射(u样本(1秒))减少f
我认为公平地说,这是一个非常常见的用例。为了减少抽象性,假设我有许多连续发射数据的温度传感器。这些将是我的
列表中的元素。它们以国际单位制产生温度,我想计算平均温度(这是
f
)。我还想选择以摄氏度或华氏度显示结果

  • 上述两种方法中的哪一种(欢迎任何其他建议)在空间/时间方面更有效
  • 比如说,我不仅想显示平均温度,还想显示单个(可能转换的)温度。这会影响答案吗
  • 如果观察值来自不同的来源(例如,在不同的线程上观察到),与它们是否来自单个序列化流(例如,单个观察值上的
    groupBy
    运算符的结果)相比,您的答案是否会改变
  • 考虑到我上面所说的背压,如果取消此要求(即无需重新取样),您的答案会有所不同吗

  • 我认为
    as
    操作符在这里很有用。在我的例子中,我不仅仅有一堆可观察的东西;我有很多可以观察到的东西。因此,首先我创建了一个helper类,将每个事物与其可观察对象相关联:

    public class Pair<K, V>{
        private final K mKey;
        private final Observable<V> mValues;
    
        public Pair(final K key, final Observable<V> values) {
            mKey = key;
            mValues = values;
        }
        public K key() {
            return mKey;
        }
    
        public Observable<V> values() {
            return mValues;
        }
    }
    
    我的“东西”是玩家,我想定期建立他们位置的R树。因此,我将玩家与其位置观测值配对,然后应用
    MapLatest

    players.map(player -> new Pair<>(player, player.location()))
        .as(new MapLatest<>()).subscribe(...);
    
    players.map(player->new对(player,player.location())
    .as(新地图最新版本()).subscribe(…);
    
    请注意,我在
    MapLatest
    中没有显示任何实际发出任何信息的代码。我正在考虑各种方法来做到这一点:

    • 使用
      可观察对象构建
      MapLatest
      ,并在可观察对象发出时发出
    • 构造带有
      谓词的
      MapLatest
      ,该谓词在应该发出时返回true
    • MapLatest
      一个
      emit
      方法并从外部触发发射

    还要注意,
    可观察的
    从未终止。就我而言,这是故意的。

    你有没有找到解决办法?没有;我已经离开了RX。我认为这需要一个专门的数据结构,尽管这是一种常见的模式。这并不是说很难实现(正如我上面所建议的),而是困难在于使用一元/集合式接口。例如,请看。
    players.map(player -> new Pair<>(player, player.location()))
        .as(new MapLatest<>()).subscribe(...);