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.
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.
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.
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).
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. 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
Tags und Links f# map parallel-processing