¿Qué lista, matriz o secuencia son más eficientes para el procesamiento en paralelo y pueden implementar fácilmente operaciones paralelas como parmap
, parfilter
, etc.?Colecciones de datos paralelos en F #
EDITAR: Gracias por las sugerencias. Array.Parallel
parece una buena opción. También compruebo PSeq.fs
y tengo una pregunta sobre cómo funciona el pmap
a 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 pmap
para la lista. Descubrí que Tomas tiene una implementación de ParallelList
en su publicación de blog here. 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.
responder a mi propia pregunta en la primera edición:
he intentado romper una gran lista en trozos y luego se aplica a cada sublista asíncrono.
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.
Depende, pero casi seguro querrás 'Array.Parallel' y no' async'. –