Это хорошая идея запустить `... par.map(` на больших списках напрямую?

Скажем, у меня есть несколько больших (несколько миллионов элементов или около того) список строк. Это хорошая идея запустить что-то вроде этого:

val updatedList = myList.par.map(someAction).toList

Или лучше было бы сгруппировать список перед запуском ...par.map(, например:

val numberOfCores = Runtime.getRuntime.availableProcessors
val updatedList = 
  myList.grouped(numberOfCores).toList.par.map(_.map(someAction)).toList.flatten

UPDATE: Учитывая, что someAction довольно дорого (по сравнению с grouped, toList и т.д.)

Ответ 1

Запустите par.map напрямую, так как он уже учитывает количество ядер. Однако не сохраняйте List, так как требуется полная копия для создания параллельной коллекции. Вместо этого используйте Vector.

Ответ 2

Как и было предложено, избегайте использования списков и par, поскольку это влечет за собой копирование списка в коллекцию, которая может быть легко пройдена параллельно. Для объяснения см. Обзор параллельных коллекций.

Как описано в разделе для конкретных классов параллельной коллекции, ParVector может быть менее эффективным для операции map, чем a ParArray, поэтому, если вы действительно обеспокоены производительностью, может иметь смысл использовать параллельный массив.

Но если someAction достаточно дорого, то его вычислительная стоимость скроет последовательные узкие места в toList и par.