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(...);