Java ReactiveX:计算可观测数据中不同元素的频率
我有一个可观察的Java ReactiveX:计算可观测数据中不同元素的频率,java,scala,reactive-programming,rx-java,reactivex,Java,Scala,Reactive Programming,Rx Java,Reactivex,我有一个可观察的。我想把它转换成一个映射,它告诉我每个不同字符串的出现次数 可观测数据包含约10亿个元素,其中1000个元素是不同的(因此,不能将整个数据集存储在RAM中)。目前,我迭代了可观察的,并更新了HashMap。我还确保在同一线程上进行观察,以避免出现争用情况。然而,获取元素频率本来应该很容易并行化,因此利用它会很好 有办法吗?您可以使用groupBy而不是自己维护HashMapgroupBy将为每个键创建一个可观察的,您可以在不同的计划程序上订阅它。例如: public class
。我想把它转换成一个映射
,它告诉我每个不同字符串的出现次数
可观测数据包含约10亿个元素,其中1000个元素是不同的(因此,不能将整个数据集存储在RAM中)。目前,我迭代了可观察的
,并更新了HashMap
。我还确保在同一线程上进行观察,以避免出现争用情况。然而,获取元素频率本来应该很容易并行化,因此利用它会很好
有办法吗?您可以使用
groupBy
而不是自己维护HashMap
groupBy
将为每个键创建一个可观察的
,您可以在不同的计划程序上订阅它。例如:
public class KeyCounter {
int key;
long count;
public KeyCounter(int key, long count) {
this.key = key;
this.count = count;
}
@Override
public String toString() {
return "key: " + key + " count: " + count;
}
}
@Test
public void foo() {
Observable<Integer> o = Observable.just(1, 2, 3, 2, 1);
o.groupBy(i -> i).flatMap(
group ->
group.subscribeOn(Schedulers.computation()).countLong().map(count -> new KeyCounter(group.getKey(), count))
).subscribe(System.out::println);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
公共类密钥计数器{
int键;
长计数;
公钥计数器(整数键,长计数){
this.key=key;
this.count=计数;
}
@凌驾
公共字符串toString(){
返回“键:+键+”计数:+计数;
}
}
@试验
公共图书馆{
可观测的o=可观测的。刚好(1,2,3,2,1);
o、 groupBy(i->i).flatMap(
组->
group.subscribeOn(Schedulers.computation()).countLong().map(count->newkeycounter(group.getKey(),count))
).subscribe(System.out::println);
试一试{
睡眠(1000);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
由于数据源是顺序的,并且更新操作是O(1),我不确定并行操作是否能带来多大好处。@akarnokd数据源是在多个线程上计算的,使用我当前的方法,我必须同步,这会减慢速度。