У меня есть большое количество наблюдаемых и хочу объединить их в одно значение. Они обновлены с высокой частотой и считают, что необходимо использовать «потерю» стратегии противодавления. Я выбрал sample
, но все, что угодно, было бы приемлемым. Я хотел бы знать, что самый эффективный способ (производительность и/или ресурс) делает это. Два подхода очевидны:Эффективная выборка большого числа наблюдаемых rx вместе
val list : Iterable[Observable[Double]] = ???
val f : (Double,Double) => Double = ???
(Observable combineLatest list) sample (1 second) reduce f
или альтернативно
combineLatest (list map (_ sample (1 second))) reduce f
Я думаю, что справедливо сказать, что это очень распространенный вариант использования. Чтобы сделать это менее абстрактным, представьте, что у меня много датчиков температуры, которые непрерывно излучают данные. Это были бы элементы моего list
. Они производят температуру в единицах СИ, и я хочу рассчитать среднюю температуру (это f
). Я также хочу иметь выбор, чтобы показать результат в градусах Цельсия или Фаренгейта.
- Какой из двух подходов выше (любые другие предложения приветствуются, хотя) было бы более эффективным пространством/временем?
- Скажем, я хотел отображать не только среднюю температуру, но и индивидуальную (возможно, преобразованную) температуру. Это влияет на ответ?
- Будет ли ваш ответ изменяться, если Observables поступает из разных источников (например, наблюдается в отдельных потоках), независимо от того, пришел ли он в один сериализованный поток (например, результат оператора
groupBy
по одному наблюдаемому). - Принимая во внимание то, что я говорю выше о противодавлении, будет ли ваш ответ меняться, если это требование было отброшено (т. Е. Нет необходимости повторной выборки).
Вы когда-нибудь находили решение? –
Нет; Я перешел от RX. Я думаю, что для этого требуется специализированная структура данных, несмотря на то, что она является общей моделью. Дело не в том, что это сложно реализовать (как я уже сказал выше), но жесткий бит делает это с помощью монадического/коллекционного интерфейса. Например, посмотрите https://github.com/OpenHFT/Chronicle-Map. – Luciano