Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ReactiveX:计算可观测数据中不同元素的频率_Java_Scala_Reactive Programming_Rx Java_Reactivex - Fatal编程技术网

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数据源是在多个线程上计算的,使用我当前的方法,我必须同步,这会减慢速度。