Распараллеливание рекурсивного метода - C#
Формулировка задачи:
Реализую метод медианного сечения квантования изображений:
http://www.intuit.ru/studies/courses/993/163/lecture/4513?page=3
Если кратко о его сути: сортируем массив пикселей по цветовому каналу с наибольшей разницей минимального и максимального значения, делим массив пополам и делаем то же самое с этими половинками, пока в итоге не массивов будет не столько, сколько нам нужно цветов, и потом усредняем значения цветовых каналов в каждом из этих массивов.
Сейчас метод выглядит так:
Производительностью доволен: всё работает очень быстро (всего 7 секунд для 4к изображения не на самом сильном ноутбучном процессоре); но почему-то приложение продолжает выполняться после даже вывода изображения (которое происходит после вызова функции) и кушать память в течение достаточно долгого времени. Что я делаю не так?
private static void Algorithm(Pixel[] array) { if (array.Length <= ArrayLen / 65536) { //усреднение значений цветовых каналов в массиве и их вывод за пределы функции } else { Pixel[] newArray1 = new Pixel[array.Length / 2], newArray2 = new Pixel[array.Length / 2]; SortPixels(ref array, GetSortOrder(array)); //сортировка массива по каналу с наибольшим range newArray1 = array.Take(array.Length / 2).ToArray(); newArray2 = array.Skip(array.Length / 2).ToArray(); Task thread1 = Task.Factory.StartNew(() => { Algorithm(newArray1); }); Task thread2 = Task.Factory.StartNew(() => { Algorithm(newArray2); }); } }
Решение задачи: «Распараллеливание рекурсивного метода»
textual
Листинг программы
private static async Task Algorithm(Pixel[] array) { for (int segmentLength = array.Length; segmentLength > ArrayLen / 65536; segmentLength /= 2) { var sortTasks = new List<Task>(); for (int startIndex = 0; startIndex < array.Length; startIndex += segmentLength) { int partitionEndIndex = Math.Min(array.Length, startIndex + segmentLength); sortTasks.Add(Task.Run(() => SortPixels(array, startIndex, partitionEndIndex, GetSortOrder(array, startIndex, partitionEndIndex)))); //сортировка массива по каналу с наибольшим range) } await Task.WhenAll(sortTasks); } //усреднение значений цветовых каналов в массиве и их вывод за пределы функции }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д