Можно ли использовать представления с параллельными коллекциями? - PullRequest
20 голосов
/ 12 декабря 2011

Форма поиска результата в отображении коллекции выглядит примерно так:

list.view.map(f).find(p)

, где list - это List[A], f - это A => B, и1008 * - это B => Boolean.

Можно ли использовать view с параллельными коллекциями?Я спрашиваю, потому что я получаю очень странные результаты:

Welcome to Scala version 2.9.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0).
Type in expressions to have them evaluated.
Type :help for more information.

scala> val f : Int => Int = i => {println(i); i + 10}
f: Int => Int = <function1>

scala> val list = (1 to 10).toList
list: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> list.par.view.map(f).find(_ > 5)
1
res0: Option[Int] = Some(11)

scala> list.par.view.map(f).find(_ > 5)
res1: Option[Int] = None

1 Ответ

1 голос
/ 27 февраля 2012

См. "Общая структура параллельных коллекций" , статья Мартина Одерского и др., В которой обсуждаются новые параллельные коллекции.На странице 8 есть раздел «Параллельные представления», в котором рассказывается о том, как view и par могут использоваться вместе, и как это может дать преимущества в производительности как для представлений, так и для параллельных вычислений.

Что касается вашего конкретногоНапример, это определенно ошибка.Метод exists также ломается, и если он разбивается на один список, он разбивает его на все остальные списки, поэтому я считаю, что это проблема, когда операции, которые могут быть прерваны на полпути (find и exists, могут остановиться, как толькоесть ответ) удалось каким-то образом разбить пул потоков.Это может быть связано с ошибкой с исключениями, возникающими внутри функций, передаваемых в параллельные коллекции .Если так, это должно быть исправлено в 2.10.

...