5

Zuerst nahm ich an, dass jede Sammlungsklasse eine zusätzliche par Methode erhalten würde, die die Sammlung in eine passende parallele Datenstruktur umwandeln würde (wie map gibt die beste Sammlung für den Elementtyp in Scala 2.8 zurück).Was ist der bevorzugte Weg, um die parallelen Sammlungen in Scala zu verwenden?

Nun scheint es, dass einige Collection-Klassen unterstützen eine par Methode (z. B.. Array), aber andere haben toParSeq, toParIterable Methoden (z. B.. Liste). Das ist ein bisschen komisch, da Array nicht oft benutzt oder empfohlen wird.

Was ist der Grund dafür? Wäre es nicht besser, nur eine par für alle Sammlung Klassen zur Verfügung zu haben, die "das Richtige" tun?

Wenn ich Daten habe, die parallel verarbeitet werden könnten, welche Typen sollte ich verwenden? Die Merkmale in scala.collection oder die Art der Implementierung direkt?

Oder sollte ich jetzt Arrays bevorzugen, weil sie billiger zu parallelisieren scheinen?

Antwort

5

Listen sind nicht so gut für die parallele Verarbeitung geeignet. Der Grund ist, dass Sie, um das Ende der Liste zu erreichen, jedes einzelne Element durchlaufen müssen. Daher können Sie die Liste auch einfach als Iterator behandeln und daher auch etwas allgemeineres wie toParIterable verwenden.

Jede Sammlung, die einen schnellen Index hat, ist ein guter Kandidat für die parallele Verarbeitung. Dies beinhaltet alles, was LinearSeqOptimized implementiert, plus Bäume und Hash-Tabellen. Array hat so schnell wie ein Index, so dass es eine ziemlich natürliche Wahl ist. Sie können auch Dinge wie ArrayBuffer verwenden (die eine par Methode hat, die eine ParArray zurückgibt).

+0

Das scheint so zu sein, als ob '' SeqLike' 'nur eine '.sortierte' ist, also musst du' items.toSeq.sorted' anstelle von 'items.sorted' machen. Warum also all die '.toParIterable' etc. Methoden, anstatt Leuten einfach zu sagen,' items.toArray.par' zu machen, wenn 'items' nicht parallelisierbar sind? – Steve

+0

@Steve - Es besteht die Möglichkeit, dass die toParIterable-Methoden keine Kopie der zugrunde liegenden Daten erstellen müssen. Auch wenn sie langsam sind, könnten sie gelegentlich ein guter Kompromiss sein (z. B. wenn die Liste durchlaufen wird oder was nicht schnell verglichen mit der Berechnung für jedes Element der Liste ist). –