Что такое / как выбрать «предварительную выборку» для параллельного потока?

#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. Это то же самое, что и с любым оператором с обратным давлением, имеющим внутренний буфер. Он содержит максимальное количество элементов до тех пор, пока нисходящий поток, в данном случае параллельные рельсы, не запросит больше. По мере того, как этот буфер истощается, у восходящего потока запрашивается больше элементов.