#rx-java2 #rx-java3
#rx-java2 #rx-java3
Вопрос:
Я читал документацию по параллельным потокам здесь, и в ней упоминалось:
По умолчанию уровень параллелизма устанавливается равным количеству доступных процессоров (Runtime.getRuntime().availableProcessors()), а объем предварительной выборки из последовательного источника устанавливается равным Flowable.bufferSize() (128). Оба могут быть указаны с помощью перегрузок parallel() .
Я до сих пор не понимаю цели этой предварительной выборки и почему она такая большая. Я предполагаю, что это означает, что операторы под ним будут содержать более 1 выбросов (по умолчанию 128). Однако я не могу себе представить, что это хорошая идея, поскольку нижестоящие операторы будут фактически однопоточными, пока у нас не будет более 128 выбросов из восходящего потока? (например, если у нас есть 130, первые 128 будут предварительно выбраны одним потоком, а последние 2 будут переданы второму. И все остальные потоки ничего не будут делать.).
Я предполагаю, что объекты меньшего размера в более быстрых потоках должны иметь большую предварительную выборку, поскольку стоимость передачи данных между цепочкой rx будет стоить относительно дороже, поэтому мы хотим, чтобы предварительная выборка была выше. Я не уверен, какие числа выбрать здесь.
Комментарии:
1. Если у вас нет ограничений по памяти или вы не хотите резервировать ядра процессора, нет необходимости много возиться с этими параметрами.
parallel
использует циклическую отправку элементов между готовыми параллельными рельсами, чтобы все они были заняты.2. У меня есть ограничения памяти (сбой с OutOfMemoryException), и я нашел несколько способов это исправить: используя относительно менее распространенные концепции rxjava, поэтому это было бы полезно понять. Циклический перебор, похоже, противоречит предварительной выборке? Именно поэтому я спросил, что такое предварительная выборка (я не думаю, что это где-либо объясняется)
3. Это то же самое, что и с любым оператором с обратным давлением, имеющим внутренний буфер. Он содержит максимальное количество элементов до тех пор, пока нисходящий поток, в данном случае параллельные рельсы, не запросит больше. По мере того, как этот буфер истощается, у восходящего потока запрашивается больше элементов.