2012-01-20 2 views
0

По Scaladoc,Странное поведение в Scala Parallel View

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

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

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

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 на pvs, он выводит: enter image description here

Я не могу понять, почему performa сть из 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")) 
+4

Просьба представить текст за вырезку, если это возможно, а не изображения. Btw .: Что такое 'tn', название темы? –

+0

Пронумерованный из-за изображений был скопирован и вставлен текст был бы намного лучше. –

ответ

1

Поскольку интерпретатор вычисляет выражение, заставляя его, если выражение представляет собой параллельный вид коллекции, так что он может печатать (по существу, заставляет взглянуть). Попробуйте либо работает это как автономная программа 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, делают то же самое на обычных представлениях.

+0

Извините, какова ваша точка примера? –

+1

Пункт примера состоит в том, что если вы откажете интерпретатору распечатать выражение с правой стороны (которое является параллельным представлением), назначив выражение параллельного представления в поле в каком-либо объекте, интерпретатор не будет оценивать представление по вызывая «силу». Таким образом, форсирование не происходит, когда вы вызываете 'filter' и' map' - это происходит только в интерпретаторе, потому что ему нужно распечатать представление. Это связано с тем, что интерпретатор обрабатывает представления коллекции специально (избегает «force»), но не так специально для обработки представлений параллельной коллекции так же хорошо. Надзор :) – axel22

+0

Извините, вы не параллельный вид –

Смежные вопросы