Преобразование массивов на месте с параллельными коллекциями - PullRequest
5 голосов
/ 26 мая 2011

Когда у вас есть массив объектов, часто желательно (например, по соображениям производительности) обновить (заменить) некоторые из объектов на месте.Например, если у вас есть массив целых чисел, вы можете заменить отрицательные целые на положительные:

// Faster for primitives
var i = 0
while (i < a.length) {
  if (a(i) < 0) a(i) = -a(i)
  i += 1
}

// Fine for objects, often okay for primitives
for (i <- a.indices) if (a(i) < 0) a(i) = -a(i)

Каков канонический способ выполнения такой модификации с использованием библиотеки параллельных коллекций?

Ответы [ 3 ]

5 голосов
/ 26 мая 2011

Что касается параллельных массивов - это недосмотр.Параллельная transform для параллельных массивов, вероятно, будет включена в следующую версию.

Однако вы можете сделать это, используя параллельный диапазон:

for (i <- (0 until a.length).par) a(i) = computeSomething(i)

Обратите внимание, что не все изменяемые коллекциимогут быть изменены таким образом.В общем, если вы хотите изменить что-то на месте, вы должны убедиться, что оно правильно синхронизировано.В этом случае это не проблема для массивов, так как разные индексы будут изменять разные элементы массива (и изменения видны для вызывающей стороны в конце, так как завершение параллельной операции гарантирует, что все записи станут видимыми для вызывающей стороны).

2 голосов
/ 26 мая 2011

Как насчет создания параллельной коллекции, которая хранит индексы в массиве для преобразования, а затем запускает foreach, чтобы преобразовать одну ячейку в массиве, учитывая индекс.

Таким образом, у вас также есть больший контроль, и можно создать четырех рабочих, которые работают на четырех четвертях массива. Потому что простого переворота одного целого знака, вероятно, недостаточно для оправдания параллельных вычислений.

2 голосов
/ 26 мая 2011

Последовательные изменяемые коллекции имеют методы, такие как transform, которые работают на месте.

Параллельным изменяемым коллекциям не хватает этих методов, но я не уверен, что за этим есть причина, или это просто упущение.

Мой ответ таков: вам сейчас не повезло, но вы, конечно, можете написать это сами.

Может быть, имеет смысл подать заявку после того, как об этом поговорили немного подробнее?

...