map - metodos - tecnicas de recoleccion de datos pdf
Recolecciones de datos paralelos en F# (3)
De manera realista, la sobrecarga de cambiar los tipos de recolección es muy pequeña en comparación con el costo de realizar una operación asincrónica, por lo que el tipo de recopilación no importa.
Una vez dicho esto, List
tiende a encajar mejor con la sintaxis F # por lo que puede ser mejor
¿Cuál de list, array o seq son más eficientes para el procesamiento paralelo y pueden implementar fácilmente operaciones paralelas como parmap
, parfilter
, etc.?
EDITAR: Gracias por las sugerencias. Array.Parallel
parece una buena opción. También comprobé PSeq.fs
y tengo una pregunta sobre cómo funciona el pmap
continuación.
let pmap f xs =
seq { for x in xs -> async { return f xs } }
|> Async.Parallel
|> Async.RunSynchronously
¿Se genera un nuevo hilo para cada elemento de la secuencia? Si es así, ¿hay alguna forma de dividir el seq en fragmentos y crear una nueva tarea para que cada fragmento se evalúe en paralelo?
También me gustaría ver si hay alguna implementación similar de pmap
para la lista. Descubrí que Tomas tiene una implementación de ParallelList
en su blog aquí . Pero no estoy seguro de si convertir una lista en una matriz para realizar una evaluación paralela no implica demasiada sobrecarga y si puede evitarse.
EDITAR: Gracias por todas sus entradas. Tomás respondió mi pregunta original.
Respondiendo mi propia pregunta en la primera edición:
Traté de dividir una gran lista en fragmentos y luego aplicar la función asincrónica a cada sublista.
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
Los resultados: map
: 15s, pmap
: 7s, pmapchunk
: 10s.
Hay una implementación paralela de algunas operaciones de matriz en la biblioteca F #. En general, trabajar con matrices probablemente sea más eficiente si las operaciones individuales toman mucho tiempo.
- Eche un vistazo al módulo
Array.Parallel
. Contiene funciones para crear una matriz (init
), para realizar cálculos con elementos (map
) y tambiénchoose
función que puede usarse para implementar el filtrado.
Si está escribiendo una compleja serie de operaciones que son bastante simples, pero hay una gran cantidad de ellas, necesitará usar PLINQ, que paraleliza toda la línea de tubería en lugar de paralelizar operaciones individuales (como el mapa) .
- Eche un vistazo al módulo
PSeq
de F # PowerPack para un contenedor amigable F # - define el tipo depseq<''T>
y las funciones habituales para trabajar con ellos. Esta publicación de blog también contiene información útil.
Junto con la sugerencia de Tomas de mirar Array.Parallel
, vale la pena señalar que las matrices (y las colecciones respaldadas por arreglos) siempre serán las más eficientes para atravesar (mapa, iter, ...) porque están almacenadas en la memoria contigua.