Ответ 1
Запустите par.map
напрямую, так как он уже учитывает количество ядер. Однако не сохраняйте List
, так как требуется полная копия для создания параллельной коллекции. Вместо этого используйте Vector
.
Скажем, у меня есть несколько больших (несколько миллионов элементов или около того) список строк. Это хорошая идея запустить что-то вроде этого:
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
и т.д.)
Запустите par.map
напрямую, так как он уже учитывает количество ядер. Однако не сохраняйте List
, так как требуется полная копия для создания параллельной коллекции. Вместо этого используйте Vector
.
Как и было предложено, избегайте использования списков и par
, поскольку это влечет за собой копирование списка в коллекцию, которая может быть легко пройдена параллельно. Для объяснения см. Обзор параллельных коллекций.
Как описано в разделе для конкретных классов параллельной коллекции, ParVector
может быть менее эффективным для операции map
, чем a ParArray
, поэтому, если вы действительно обеспокоены производительностью, может иметь смысл использовать параллельный массив.
Но если someAction
достаточно дорого, то его вычислительная стоимость скроет последовательные узкие места в toList
и par
.