Supongamos que tenemos una larga lista de puntos List<Point> pointList
(ya almacenados en la memoria) donde cada Point
contiene coordenadas X, Y y Z.Cómo evitar OrderBy - problemas de uso de memoria
Ahora, me gustaría seleccionar, por ejemplo, N% de puntos con los mayores valores Z de todos los puntos almacenados en pointList
. En este momento lo estoy haciendo así:
N = 0.05; // selecting only 5% of points
double cutoffValue = pointList
.OrderBy(p=> p.Z) // First bottleneck - creates sorted copy of all data
.ElementAt((int) pointList.Count * (1 - N)).Z;
List<Point> selectedPoints = pointList.Where(p => p.Z >= cutoffValue).ToList();
Pero tengo aquí dos cuellos de botella en uso de memoria: por primera vez durante OrdenarPor (más importante) y segundo durante la selección de los puntos (esto es menos importante, ya que por lo general quieren seleccione solo una pequeña cantidad de puntos).
¿Hay alguna forma de reemplazar OrderBy (o tal vez otra forma de encontrar este punto de corte) con algo que utiliza menos memoria?
El problema es bastante importante, porque LINQ copia todo el conjunto de datos y para los archivos grandes que estoy procesando a veces alcanza unos pocos cientos de MB.
Me parece que el problema más grande aquí es que está tratando de manipular tantos millones de puntos de datos en la memoria. ¿Por qué no estás usando algún tipo de base de datos? – Aaronaught
@Aaronaught - Acepto que la mayoría de las bases de datos se encargarán de esto sin pensarlo dos veces. * (Sin incluir Informix, que tomará muchos pensamientos con una gran posibilidad de corromper sus datos.) * – ChaosPandion
@Aaronaught, desafortunadamente, estoy creando solo una parte del proyecto más grande y estoy obteniendo la lista ya almacenada en la memoria. Por lo tanto, es crucial evitar copiarlo. – Gacek