При параллельном сборе агрегат соблюдает порядок? - PullRequest
2 голосов
/ 10 июня 2011

в Scala, у меня есть параллельные Итерируемые элементы, и я хочу перебрать их и каким-то образом агрегировать результаты, но по порядку. я упросту свой вариант использования и скажу, что мы начинаем с Iterable целых чисел и хотим объединить их строковое представление в параллель с результатом в порядке.

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

Ответы [ 3 ]

4 голосов
/ 10 июня 2011

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

val concat = myParallelList.map(_.toString).reduce(_+_)
1 голос
/ 10 июня 2011

Для складок: foldRight и foldLeft не могут обрабатываться параллельно, вам нужно использовать новый метод fold (больше информации там ).

Как и fold, aggregate может выполнять свою работу параллельно: он «последовательно перемещается по элементам в разных разделах» (Scaladoc), хотя, похоже, что вы не имеете прямого влияния на выбор разделов.

0 голосов
/ 10 июня 2011

Я ДУМАЮ, что сохранение «порядка» в смысле комментария к ответу Жана-Филиппа Пелле гарантировано благодаря тому, как параллельные коллекции реализуются в соответствии с публикацией Одерского (http://infoscience.epfl.ch/record/150220/files/pc.pdf) IFF часть, которая разделяет вашу коллекциюведет себя хорошо по отношению к порядку.

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

...