Преобразование массивов на месте с параллельными коллекциями

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

// 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 ответа

Решение

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам