Странное поведение в Scala Parallel View - PullRequest
0 голосов
/ 20 января 2012

По словам Скаладока,

Представление - это ленивая версия некоторой коллекции.Преобразователи коллекций, такие как map или filter или ++, не пересекают никакие элементы при применении к представлению.Вместо этого они создают новое представление, которое просто записывает тот факт, что операция должна быть применена.

Это означает, что операции не будут применены, пока элементы не будут доступны.Но как насчет параллельного?

Взгляните на этот пример:

def tn = Thread.currentThread.getName
val strList = List("I", "am", "a" , "student", ".", "I", "come", "from", "China", ".","I","love","peace")
val pvs = strList.par.view.filter{ s => println("f "+ tn); s == "I"}.map{s => println("m " + tn); s.toLowerCase}

Вторая будет распечатана следующим образом:

enter image description here

При подаче foreach on pvs, он выводит: enter image description here

Я не могу понять, почему производительность стиля Parallel отличается от обычной:

val strList = List("I", "am", "a" , "student", ".", "I", "come", "from", "China", ".","I","love","peace")  // or read from a text file , e.g. article.txt 
strList.view.filter{s => println("f");  s == "I"}.map{s => println("m"); s.toLowerCase}.foreach(s => println("p"))

1 Ответ

1 голос
/ 20 января 2012

Поскольку интерпретатор оценивает выражение, форсируя его, если выражение является параллельным представлением коллекции, чтобы он мог распечатать его (по сути, форсирует представление). Попробуйте либо запустить его как отдельную программу Scala, либо сделайте следующее:

scala> object foo { var bar: AnyRef = null }

scala> foo.bar = strList.par.view.filter{ s => println("f "+ tn); s == "I"}.map{s => println("m " + tn); s.toLowerCase}

EDIT:

Другая проблема, описанная выше, - это метод filter для параллельных представлений - в отличие от обычных представлений, он реализуется путем принудительного сбора данных. Это означает, что в тот момент, когда вы вызываете filter на параллельной view, вся отфильтрованная коллекция будет принудительно преобразована в массив, и будет вызван предикат, связанный с фильтром. Такие методы, как groupBy, делают то же самое в обычных представлениях.

...