Mittwoch, 11. August 2010

Quickie: Scala Parallel Collections

Ich bin gerade dabei mir die aktuelle Version der scala.collection.parallel._ anzuschauen (ist im nightly) und prompt habe ich einen Bug gefunden. Der Fehler tritt in ParArray[T], sowie ParSeq[T] auf und betrifft die Methode foldLeft. Offenbar verschluckt die Methode ab und an ein paar Werte, so dass gelegentlich ein falsches Ergebnis herauskommt. Kleines Beispiel:

import scala.collection.parallel.mutable._
val a = ParArray(0 until 10: _*)
for(i <- 0 until 10) println("Should be: " + a.sum + " is: " + a.foldLeft(0)(_+_))
Dieser Code liefert folgende (oder ähnliche) Ausgabe:
Should be: 45 is: 45
Should be: 45 is: 43
Should be: 45 is: 38
Should be: 45 is: 38
Should be: 45 is: 41
Should be: 45 is: 40
Should be: 45 is: 21
Should be: 45 is: 45
Should be: 45 is: 45
Should be: 45 is: 45
Wie man sehen kann sind es teilweise gravierende Unterschiede. Auch schön sehen kann man es anhand eines Strings:
import scala.collection.parallel.mutable._
val a = ParArray("foobar": _*)
for(i <- 0 until 10) println(a.foldLeft("")(_+_))
Ausgabe:
oo
fboor
fbooar
fobr
fboar
fboar
fbooar
fbooar
fbooar
baro
Hier ist nicht nur zu sehen, dass teilweise über 50% der Elemente komplett ignoriert werden, sondern dass auch noch die Reihenfolge absolut willkürlich ist. Tauscht man in beiden Fällen das foldLeft durch ein foldRight erhält man die zu erwartenden Ergebnisse.

Ich werde mir die Parallel Collections noch weiter ansehen und ggf. weitere Fehler oder Merkwürdigkeiten hier posten.


So long

Keine Kommentare:

Kommentar veröffentlichen