2012-04-07 9 views
11

Powiedzmy, że mam dość dużą (kilka milionów pozycji) listę znaków. Czy to jest dobry pomysł? uruchomić coś takiego:Czy to jest dobry pomysł, aby uruchomić `... par.map (` na dużych listach bezpośrednio?

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

Albo byłoby lepszym pomysłem grupy lista przed uruchomieniem ...par.map(, tak:

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

UPDATE: Zważywszy, że someAction jest dość drogie (w porównaniu do grouped , toList itp.)

Odpowiedz

14

Uruchom bezpośrednio, ponieważ już bierze pod uwagę liczbę rdzeni. Jednak nie należy przechowywać List, ponieważ wymaga to pełnej kopii do utworzenia kolekcji równoległej. Zamiast tego użyj Vector.

8

Zgodnie z sugestiami należy unikać używania list i par, ponieważ pociąga to za sobą kopiowanie listy do kolekcji, która może być łatwo wykonywana równolegle. Aby uzyskać wyjaśnienie, patrz: Parallel Collections Overview.

Jak opisano w section on concrete parallel collection classes, A ParVector mogą być mniej skuteczne w działaniu niż ParArraymap, więc jeśli jesteś naprawdę zaniepokojony wydajności, może mieć sens, aby użyć równoległego tablicę.

Ale jeśli someAction jest wystarczająco kosztowne, to jego koszt obliczeniowy ukryje kolejne wąskie gardła w toList i par.

Powiązane problemy