Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.12.2017, 17:36   #1
shvarz23
 
Регистрация: 10.12.2017
Сообщений: 5
По умолчанию Не хватает памяти для сортировки

У меня есть текстовый файл с числовыми рядами, в файле больше 8 миллионов строк по 6 чисел через пробел.
Я их построчно считываю в строковый массив и начинаю парсить в цикле из строкового массива и заношу их в коллекцию.

В коллекцию занес и начинаю сортировать и тут выскакивает ошибка , что не хватает памяти.
я посмотрел в диспетчере памяти вроде хватает,с включенным хромом есть скрин и без включенного хрома.

Хотя, если еще суммировать то, что 1888 мб памяти идет на выделение на видео чип, то получается не хватает.

Вот код коллекции, напишите как можно оптимизировать , может можно как-то удалять сразу допустим строковый массив ,а не ждать пока компилятор сам удалит из кучи:

Код:

class RadRad 
    {
        public double caPosl { get; set; }
        public ulong indPosl { get; set; }
        public double x1 { get; set; }
        public double x2 { get; set; }
        public double x3 { get; set; }
        public double x4 { get; set; }
        public double x5 { get; set; }
        public double x6 { get; set; }
        public double x7 { get; set; }
    }



listrad = listrad.OrderBy(x => x.caPosl).ThenBy(x => x.x1).ThenBy(z => z.x2).ThenBy(y => y.x3).ThenBy(s => s.x4).ThenBy(h => h.x5).ThenBy(u => u.x6).ToList();
Да и еще ,пробовал выводить не весь массив (8млн строк), а только 2 милиона строк , программа работает без ошибок.

напишите пожалуйста как с этим бороться, заранее спасибо..
Скрины прикреплены.
Изображения
Тип файла: jpg Image 1.jpg (88.0 Кб, 113 просмотров)
Тип файла: jpg Image 2.jpg (85.8 Кб, 116 просмотров)
Тип файла: jpg Image 4.jpg (98.2 Кб, 119 просмотров)
Тип файла: jpg Image 5.jpg (98.9 Кб, 112 просмотров)
Тип файла: jpg Image 6.jpg (97.2 Кб, 122 просмотров)

Последний раз редактировалось shvarz23; 23.12.2017 в 17:55.
shvarz23 вне форума Ответить с цитированием
Старый 23.12.2017, 17:51   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

Гуглить по словам - внешняя сортировка. И стоит начать ходить на занятия, хотя бы для того, чтобы знать по каким словам гуглить.
p51x вне форума Ответить с цитированием
Старый 23.12.2017, 17:53   #3
shvarz23
 
Регистрация: 10.12.2017
Сообщений: 5
По умолчанию

сейчас еще раз проверил, на 4,8 милиона строк сортирует нормально без ошибок, а на 4,9 миллиона строк уже ошибку выдает, хотя памяти еще дофига .
В чем проблема подскажите, как можно решить или обойти?
Изображения
Тип файла: jpg Image 7.jpg (101.8 Кб, 120 просмотров)
shvarz23 вне форума Ответить с цитированием
Старый 23.12.2017, 17:58   #4
shvarz23
 
Регистрация: 10.12.2017
Сообщений: 5
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Гуглить по словам - внешняя сортировка. И стоит начать ходить на занятия, хотя бы для того, чтобы знать по каким словам гуглить.
Я уже давно не хожу на занятия, отучился.
Может нужно типы другие использовать, decimal например .
Ну кто-нибудь напишите или скажите куда идти искать , только не на 3 буквы и не на 5.
shvarz23 вне форума Ответить с цитированием
Старый 24.12.2017, 15:47   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

как минимум вам LINQ тут не подходит.
LINQ создает копию данных.

памяти может еще и есть, но вот выделить большой массив не выходит.

ну и в идеале да, внешняя сортировка.
как банальный вариант можно БД юзать.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.12.2017, 16:12   #6
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Для чего данные в итоге нужны? Если нужно просто файл отсортировать - это одно, если показать упорядоченные данные - другое.
pu4koff вне форума Ответить с цитированием
Старый 24.12.2017, 21:30   #7
shvarz23
 
Регистрация: 10.12.2017
Сообщений: 5
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Для чего данные в итоге нужны? Если нужно просто файл отсортировать - это одно, если показать упорядоченные данные - другое.
Да отсортировать, а выводить я их все равно буду по 30 штук из массива, так как там памяти не хватит для вывод всех 8 миллионов строк в датагридвием.
shvarz23 вне форума Ответить с цитированием
Старый 24.12.2017, 21:33   #8
shvarz23
 
Регистрация: 10.12.2017
Сообщений: 5
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Для чего данные в итоге нужны? Если нужно просто файл отсортировать - это одно, если показать упорядоченные данные - другое.
данные нужны для сортировки и потом вывод их на экран, выводить буду частями, если внешнюю сортировку делать хз, если бы была зада просто от наим к наибольшему расположить , то да.
А там по разрядам сравнивать в строке, по максимальному сзначению сред ариф в строке, и ранжировать ряды ...
shvarz23 вне форума Ответить с цитированием
Старый 24.12.2017, 23:32   #9
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

Тогда БД
p51x вне форума Ответить с цитированием
Старый 24.12.2017, 23:54   #10
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Вариантов несколько:
1) Внешнюю сортировку можно под что угодно адаптировать. Для средних арифметических может придётся лишний раз файл перечитывать, но зато на выходе будет отсортированный файл, который можно будет относительно быстро читать кусками в грид и не нужно будет переупорядочивать при следующем запуске программы.
2) Файл в принципе подходит под формат csv, можно попробовать посмотреть в сторону OleDb провайдера который Microsoft Jet, он вроде умеет этот формат. Но я сомневаюсь, что этот провайдер как-то волшебным образом всё отсортирует на лету
3) Раз уж у нас пагинация нарисовывается, то просто при получении каждой порции данных читать весь файл построчно. При получении первых элементов всё просто. Читаем строку из файла, помещаем в свою упорядоченную коллекцию на соответствующее место. Если коллекция стала содержать больше 30 элементов, то удаляем последний. И так читаем все строки файла и на выходе будет первые 30 элементов. Немного заморочиться и можно будет сделать по этому принципу получение 3-й страницы из 30 элементов. Минус тут в скорости получения страниц данных - на каждый чих будет полностью файл перечитываться, но памяти много не будет нужно.
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа для тестирования памяти, тестирование ячеек памяти Hunter557 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 30.01.2011 19:20
При запуске ругается:"не хватает памяти..." kim_klim Свободное общение 3 19.01.2011 15:39
Не хватает памяти для записи рисунка в БД Pound БД в Delphi 3 11.01.2011 18:53
не хватает памяти Dimarik Общие вопросы C/C++ 5 17.09.2009 00:16
Не хватает памяти.Из-за того, что Паскаль старый? delphyok Паскаль, Turbo Pascal, PascalABC.NET 4 17.05.2009 15:49