Parallele Datensammlungen in F #

8

Welche von list, array oder seq sind effizienter für die parallele Verarbeitung und können problemlos parallele Operationen wie parmap , parfilter usw. implementieren?

BEARBEITEN: Danke für die Vorschläge. Array.Parallel sieht wie eine gute Option aus. Auch ausgecheckt PSeq.fs und ich habe eine Frage darüber, wie die pmap unter arbeiten.

%Vor%

Wird für jedes Element in der Sequenz ein neuer Thread erzeugt? Wenn ja, gibt es eine Möglichkeit, die Seq in Chunks zu zerlegen und eine neue Aufgabe zu erstellen, damit jeder Chunk parallel ausgewertet wird?

Ich würde auch gerne sehen, ob es eine ähnliche pmap Implementierung für die Liste gibt. Tomas hat eine ParallelList -Implementierung in seinem Blogpost hier gefunden. Aber ich bin nicht sicher, ob das Konvertieren einer Liste in Array, um parallele Auswertung durchzuführen, nicht zu viel Aufwand verursacht und wenn es vermieden werden kann?

BEARBEITEN: Danke für all Ihre Eingaben. Tomas hat meine ursprüngliche Frage beantwortet.

Beantworte meine eigene Frage in der ersten Bearbeitung:

Ich habe versucht, eine große Liste in Stücke zu zerlegen und dann Async auf jede Unterliste anzuwenden.

%Vor%

Die Ergebnisse: map : 15s, pmap : 7s, pmapchunk : 10s.

    
vis 13.03.2012, 01:27
quelle

3 Antworten

9

Es gibt eine parallele Implementierung einiger Array-Operationen in der F # -Bibliothek. Im Allgemeinen wird das Arbeiten mit Arrays wahrscheinlich am effizientesten sein, wenn die einzelnen Operationen sehr lange dauern.

  • Sehen Sie sich das Modul Array.Parallel an. Es enthält Funktionen zum Erstellen von Arrays ( init ), zum Ausführen von Berechnungen mit Elementen ( map ) und auch choose function, die zum Implementieren von Filtern verwendet werden können.

Wenn Sie eine komplexe Pipeline von Operationen schreiben, die ziemlich einfach sind, aber es gibt eine große Anzahl von ihnen, müssen Sie PLINQ verwenden, das die gesamte Pipeline parallelisiert und nicht nur einzelne Operationen parallelisiert ( wie Karte).

  • Schauen Sie sich das Modul PSeq von F # PowerPack für einen F # freundlichen Wrapper an - es definiert pseq<'T> type und die übliche Funktionen für die Arbeit mit ihnen. Dieser Blogpost enthält auch einige nützliche Informationen.
Tomas Petricek 13.03.2012, 02:14
quelle
1

Zusammen mit dem Vorschlag von Tomas, Array.Parallel zu betrachten, ist es erwähnenswert, dass Arrays (und Array-gestützte Sammlungen) immer am effizientesten zu durchqueren sind (map, iter, ...), weil sie gespeichert sind zusammenhängender Speicher.

    
Daniel 13.03.2012 02:19
quelle
0

Realistisch gesehen ist der Overhead beim Wechseln von Sammlungstypen im Vergleich zu den Kosten für eine asynchrone Operation sehr gering, so dass der Sammlungstyp keine Rolle spielt.

Nachdem das gesagt wurde, tendiert List dazu, besser mit der F # -Syntax zu koppeln, so dass es vielleicht am nettesten ist

    
John Palmer 13.03.2012 01:35
quelle

Tags und Links