2012-04-07 19 views
11

Lassen Sie uns sagen, ich habe eine etwas große (mehrere Millionen von Elementen oder so) Liste der Zeichenfolgen. Ist es eine gute Idee zu etwa wie folgt ausführen:Ist es eine gute Idee, `par.map (` auf großen Listen direkt?

val updatedList = myList.par.map(someAction).toList 

Oder wäre es eine bessere Idee zu einer Gruppe sein, die Liste vor ...par.map(, wie diese ausgeführt wird:

val numberOfCores = Runtime.getRuntime.availableProcessors 
val updatedList = 
    myList.grouped(numberOfCores).toList.par.map(_.map(someAction)).toList.flatten 

UPDATE: Da someAction recht teuer ist (im Vergleich zu grouped , toList usw.)

Antwort

14

Führen Sie par.map direkt aus, da es bereits die Anzahl der Kerne berücksichtigt. Behalten Sie jedoch keine List bei, da dies eine vollständige Kopie erfordert, um eine parallele Sammlung zu erstellen. Verwenden Sie stattdessen Vector.

8

Wie empfohlen, vermeiden Sie die Verwendung von Listen und par, da das Kopieren der Liste in eine Sammlung bedeutet, die leicht parallel durchlaufen werden kann. Eine Erläuterung finden Sie unter Parallel Collections Overview.

Wie in den section on concrete parallel collection classes beschrieben, sein ein ParVector kann weniger effizient für den map Betrieb als ein ParArray, also wenn Sie über die Leistung wirklich betroffen sind, kann es sinnvoll eine parallele Anordnung zu bedienen.

Aber, wenn someAction ist teuer genug, dann seine Rechen Kosten werden die sequentiellen Engpässe in toList und par verbergen.

Verwandte Themen