Laquelle de la liste, du tableau ou de la SEQ est plus efficace pour le traitement parallèle et peut facilement mettre en œuvre des opérations parallèles telles que Edit: em>
Merci pour les suggestions. est un Un nouveau thread s'engage-t-il pour chaque élément de la séquence? Si tel est le cas, existe-t-il une façon de briser la SEQ en morceaux et de créer une nouvelle tâche pour que chaque morceau soit évaluée en parallèle? P> Je voudrais aussi voir s'il existe un EDIT: strong>
Merci pour toutes vos entrées. Tomas a répondu à ma question originale. P> Répondre à ma propre question dans la première modification: p> J'ai essayé de casser une grande liste en morceaux puis appliquez ASYNC à chaque subliste. P> Parmap code>,
Parfilter code>, etc.
array.parallall code> ressemble à une bonne option. A également vérifié
pseq.fs code> et j'ai une question sur la manière dont le PMAP
ci-dessous fonctionne. P>
PMAP similaire Mise en œuvre pour la liste. J'ai trouvé Tomas a une implémentation code> parallelliste code> dans son blog post ici . Mais je ne suis pas sûr de convertir une liste en une liste pour effectuer une évaluation parallèle n'engage pas trop de frais généraux et si cela peut être évité? P>
let pmapchunk f xs =
let chunks = chunk chunksize xs
seq { for chunk in chunks -> async { return (Seq.map f) chunk } }
|> Async.Parallel
|> Async.RunSynchronously
|> Seq.concat
3 Réponses :
de manière réaliste, la surcharge des types de collecte de commutation est minuscule par rapport au coût de fonctionnement de l'ASYNC, de sorte que le type de collecte n'a pas d'importance. P>
après avoir dit que, liste code> a tendance à maillage plus bien avec la syntaxe F # afin qu'il soit le plus gentil p>
Liste CODE> est le pire type de collection possible pour la programmation parallèle car il est embarrassant séquentiel.
Il existe une implémentation parallèle de certaines opérations de réseau dans la bibliothèque F #. En général, travailler avec des tableaux va probablement être le plus efficace si les opérations individuelles prennent beaucoup de temps. P>
array.parallallal. / code>. Il contient des fonctions pour la création de tableau ( init code>), pour effectuer des calculs avec des éléments ( mapper code>) et aussi choisir code> fonction pouvant être utilisée pour implémenter le filtrage . li>
ul>
Si vous écrivez un pipeline complexe d'opérations qui sont assez simples, mais il y en a un grand nombre d'entre eux, vous devrez utiliser Plinq, qui parallement la ligne de conduite entière par opposition à la paralletic des opérations individuelles ( comme carte). p>
- Jetez un coup d'oeil au module
PSEQ code> de F # Powerpack pour une enveloppe conviviale F # - Il définit < Code> PSEQ <'T> code> Type et les fonctions habituelles pour travailler avec eux. Ce publication du blog contient également quelques informations utiles. LI>
ul>
Merci. J'ai rencontré array.parallallal code>,
pSEQ code>, ainsi que
parallelliste code> sur votre blog. Les deux derniers ne semblent pas être inclus dans la référence de la bibliothèque, seul
Array.ParallelL code> fait. J'ai édité la question, s'il vous plaît jeter un oeil.
«Travailler avec des tableaux va probablement être le plus efficace si les opérations individuelles prennent beaucoup de temps»? Je m'attendrais à ce que des matrices soient relativement plus rapides lorsque les opérations individuelles sont rapides.
Avec la suggestion de Tomas pour regarder array.parallallel code>, il convient de noter que les tableaux (et les collections sauvegardées de tableau) seront toujours les plus efficaces pour traverser (carte, iter, ... ) parce qu'ils sont stockés dans la mémoire contiguë. P>
Cela dépend, mais vous voulez presque certainement
array.parallallal code> et non
async code>.