Противодавление в RxJava2

Предполагается, что у меня есть 1 миллион строк записей в базе данных. Затем я использую Flowable (вместо Observable) для чтения записей, затем записываю их в файл с медленным шифрованием (запись намного медленнее, чем чтение).

Если я не использую "реактивное извлечение" во время записи, возможно ли, что моя память заполнена этими 1 миллионами записей, в то время как процесс записи все еще на полпути? Другими словами, возможно ли исключение из нехватки памяти?

Если да, то использование "реактивной тяги" - единственный способ предотвратить это исключение, если я также не хочу использовать такие операторы, как регулирование и т. Д.

1 ответ

Решение

Это действительно зависит от того, как Flowable был создан. Например, если Flowable создан с fromIterable и Iterator только запрашивает новые строки из набора результатов, когда next называется тогда обратное давление будет обрабатываться для вас.

С другой стороны, если Flowable создан с create тогда поведение будет зависеть от BackpressureStrategy что было поставлено create, Если стратегия BUFFER а также FlowableEmitter просто продолжает толкать предметы, тогда может возникнуть нехватка памяти. в идеале Flowable должны быть созданы с помощью заводских методов, которые обрабатывают противодавление естественным образом, если это невозможно, используйте другие BackpressureStrategy лайк DROP или обычай onBackpressureXXX операторы. Если все остальное не получается на заказ Flowable Реализация может быть создана или найдена в некоторой внешней библиотеке.

Другие вопросы по тегам