Soy nuevo en C#, Parallel.ForEach
y .NET en general. Quiero paralelizar una búsqueda que involucra miles de ubicaciones. Para cada ubicación, calculo la distancia del círculo grande. Ese es un cálculo que quiero extender a diferentes núcleos. Mi pregunta es ¿cómo puedo hacer esto si solo tengo una variable local del hilo, como en este MSDN TPL example? Para el resultado, miré Interlocked
, y vi sus opciones Add
, CompareExchange
, Decrement
, Exchange
, Increment
y Read
, pero no solo estoy agregando, incrementando, disminuyendo o probando la igualdad. Quiero devolver el objeto, en varios subprocesos que se ejecutan en paralelo, que tiene la distancia total más corta distancia. Mi intuición dice que esto debería ser fácil, que debería ser capaz de crear un objeto pequeño que envuelve un Location
y una distancia, pero ¿cómo puedo capturar la mejor respuesta de cada hilo y y luego elegir la distancia más corta entre ellos? Aquí está la versión no paralela:Elegir el mínimo entre los mínimos usando Parallel.ForEach
Location findClosestLocation(Location myLocation, List<Location> allLocations)
{
double closest = double.MaxValue;
Location closestLoc = null;
foreach (Location aLoc in allLocations)
{
if (aLoc != myLocation)
{
double d = greatCircle(myLocation, aLoc);
if (d < closest)
{
closest = d;
closestLoc = aLoc;
}
}
}
return closestLoc;
}
vi una DDJ Blog Post que parecía ofrecer un buen consejo, pero me preguntaba si era el mejor consejo. Veo al autor recorriendo las matrices y me pregunto si no hay una forma más funcional de hacerlo. En el mundo funcional usaría map
, lambda
y min
.
Guau, eso es tan corto y dulce como se pone. Hace que mi corazón funcional cante. ¡Gracias! – gknauth
@gknauth: Sí, también agregué la opción (correcto/rendimiento) Parallel.ForEach. Recomiendo aprender ** cómo ** funciona la otra opción y tratar de entenderlo. Sin embargo, es valioso para la mayoría de estas operaciones, solo uso PLINQ ya que es increíble. –
Gracias por darme una pista en tu blog también, se ve muy bien. ¡Escribe un libro, lo compraré! O si eso es demasiado trabajo, te compraré la cena. – gknauth