Предположим, что у нас есть большой список точек List<Point> pointList
(уже сохраненных в памяти), где каждый Point
содержит координаты X, Y и Z.
Теперь я хотел бы выбрать, например, N% точек с наибольшими Z-значениями всех точек, хранящихся в pointList
. Сейчас я делаю это так:
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();
Но у меня есть два узких места использования памяти: сначала во время OrderBy (более важно) и второй при выборе точек (это менее важно, потому что мы обычно хотим выбрать только небольшое количество очков).
Есть ли способ заменить OrderBy (или, может быть, другой способ найти эту точку отсечения) тем, что использует меньше памяти?
Проблема очень важна, поскольку LINQ копирует весь набор данных, а для больших файлов, которые я обрабатываю, он иногда попадает в несколько сотен МБ.