Обработка big data, оптимизация сортировки

258
18 октября 2017, 04:09

Имеется входной файл ~ 1млн строк, которые должны сортироваться по определенному принципу. На данный момент сортировка происходит следующим образом:

        int wk;
        while (Objects.Count() != 0)
        {
            SortRow.Add(Objects.ElementAt(0));
            Objects.RemoveAt(0);
            for (wk = 0; wk < Objects.Count(); wk++)
            {
                if (Objects.ElementAt(wk).F1 == SortRow.ElementAt(0).F1)
                {
                    SortRow.Add(Objects.ElementAt(wk));
                    Objects.RemoveAt(wk);
                    wk--;
                }
            }
            SortMas.Add(SortRow);
            SortRow = new List<line>();
        }
        progressBar1.Maximum = SortMas.Count();
        for (int i = 0; i < SortMas.Count(); i++)
        {
            for (int j = 1; j < SortMas[i].Count(); j++)
            {
                if (SortMas[i][j].F57 == 32 &&
                    (Convert.ToInt32(SortMas[i][j].F39) < Convert.ToInt32(SortMas[i][j - 1].F39)))
                {
                    do
                    {
                        line a = SortMas[i][j];
                        SortMas[i][j] = SortMas[i][j - 1];
                        SortMas[i][j - 1] = a;
                        j--;
                        if (j == 0) break;
                    }
                    while ((Convert.ToInt32(SortMas[i][j].F39) < Convert.ToInt32(SortMas[i][j - 1].F39)));
                }
                if ((SortMas[i][j].F57 != 32) &&
           (Convert.ToInt32(SortMas[i][j].F58) < Convert.ToInt32(SortMas[i][j - 1].F58))
           && SortMas[i][j - 1].F57 != 32)
                {
                    do
                    {
                        line a = SortMas[i][j];
                        SortMas[i][j] = SortMas[i][j - 1];
                        SortMas[i][j - 1] = a;
                        j--;
                        if (j == 0) break;
                    }
                    while ((Convert.ToInt32(SortMas[i][j].F58) < Convert.ToInt32(SortMas[i][j - 1].F58)
                    && SortMas[i][j - 1].F57 != 32));
                }
            }
        }

Проблема в том, что сортировка происходит катастрофически медленно. Каким образом можно это дело оптимизировать?

Answer 1

Допустим у вас есть какой то тип:

public class MyType
{
    public string F1 { get; }
    public string F39 { get; }
    public int F57 { get; }        
    public string F58 { get; }
}

как я понял SortMas у вас List<List<MyType>>

В таком случае вы можете написать свой IComparer

public class CustomComparer : IComparer<MyType>
{
    public int Compare(MyType x, MyType y)
    {
        if (y.F57 == 32)
            return int.Parse(x.F39).CompareTo(int.Parse(y.F39));
        if(x.F57 != 32 && y.F57 != 32)
            return int.Parse(x.F58).CompareTo(int.Parse(y.F58));
        return 0;
    }
}

И использовать стандартную сортировку, то есть часть под

progressBar1.Maximum = SortMas.Count();

Будет выглядеть так:

for (int i = 0; i < SortMas.Count; i++)
   SortMas[i] = SortMas[i].OrderBy(x => x, new CustomComparer()).ToList();
READ ALSO
Способ задания ключевых слов

Способ задания ключевых слов

Необходимо парсить файл на ключевые словаКлючевых слов небольшое количество

208
Query builder не принимает запрос

Query builder не принимает запрос

Всем добрый день! НЕ принимается вот такой запрос, как я его не крутил и какие только варианты не использовалПри чём, проблема в первой части...

255
Правильное переопределение Dispose(bool disposing)?

Правильное переопределение Dispose(bool disposing)?

Имеется класс, реализующий паттерн Disposable:

232
Visual Studio 2015, DEP0001 : Непредвиденная ошибка: -2147014835

Visual Studio 2015, DEP0001 : Непредвиденная ошибка: -2147014835

ЗдравствуйтеНе получается задеплоить приложение на смартфон, Microsoft Lumia 640, Windows 10 Mobile, 10

161