Противодавление в RxJava2
Предполагается, что у меня есть 1 миллион строк записей в базе данных. Затем я использую Flowable (вместо Observable) для чтения записей, затем записываю их в файл с медленным шифрованием (запись намного медленнее, чем чтение).
Если я не использую "реактивное извлечение" во время записи, возможно ли, что моя память заполнена этими 1 миллионами записей, в то время как процесс записи все еще на полпути? Другими словами, возможно ли исключение из нехватки памяти?
Если да, то использование "реактивной тяги" - единственный способ предотвратить это исключение, если я также не хочу использовать такие операторы, как регулирование и т. Д.
1 ответ
Это действительно зависит от того, как Flowable
был создан. Например, если Flowable
создан с fromIterable
и Iterator
только запрашивает новые строки из набора результатов, когда next
называется тогда обратное давление будет обрабатываться для вас.
С другой стороны, если Flowable
создан с create
тогда поведение будет зависеть от BackpressureStrategy
что было поставлено create
, Если стратегия BUFFER
а также FlowableEmitter
просто продолжает толкать предметы, тогда может возникнуть нехватка памяти. в идеале Flowable
должны быть созданы с помощью заводских методов, которые обрабатывают противодавление естественным образом, если это невозможно, используйте другие BackpressureStrategy
лайк DROP
или обычай onBackpressureXXX
операторы. Если все остальное не получается на заказ Flowable
Реализация может быть создана или найдена в некоторой внешней библиотеке.