|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
23.12.2017, 17:36 | #1 |
Регистрация: 10.12.2017
Сообщений: 5
|
Не хватает памяти для сортировки
У меня есть текстовый файл с числовыми рядами, в файле больше 8 миллионов строк по 6 чисел через пробел.
Я их построчно считываю в строковый массив и начинаю парсить в цикле из строкового массива и заношу их в коллекцию. В коллекцию занес и начинаю сортировать и тут выскакивает ошибка , что не хватает памяти. я посмотрел в диспетчере памяти вроде хватает,с включенным хромом есть скрин и без включенного хрома. Хотя, если еще суммировать то, что 1888 мб памяти идет на выделение на видео чип, то получается не хватает. Вот код коллекции, напишите как можно оптимизировать , может можно как-то удалять сразу допустим строковый массив ,а не ждать пока компилятор сам удалит из кучи: Код:
напишите пожалуйста как с этим бороться, заранее спасибо.. Скрины прикреплены. Последний раз редактировалось shvarz23; 23.12.2017 в 17:55. |
23.12.2017, 17:51 | #2 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,713
|
Гуглить по словам - внешняя сортировка. И стоит начать ходить на занятия, хотя бы для того, чтобы знать по каким словам гуглить.
|
23.12.2017, 17:53 | #3 |
Регистрация: 10.12.2017
Сообщений: 5
|
сейчас еще раз проверил, на 4,8 милиона строк сортирует нормально без ошибок, а на 4,9 миллиона строк уже ошибку выдает, хотя памяти еще дофига .
В чем проблема подскажите, как можно решить или обойти? |
23.12.2017, 17:58 | #4 | |
Регистрация: 10.12.2017
Сообщений: 5
|
Цитата:
Может нужно типы другие использовать, decimal например . Ну кто-нибудь напишите или скажите куда идти искать , только не на 3 буквы и не на 5. |
|
24.12.2017, 15:47 | #5 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
как минимум вам LINQ тут не подходит.
LINQ создает копию данных. памяти может еще и есть, но вот выделить большой массив не выходит. ну и в идеале да, внешняя сортировка. как банальный вариант можно БД юзать. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
24.12.2017, 16:12 | #6 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,065
|
Для чего данные в итоге нужны? Если нужно просто файл отсортировать - это одно, если показать упорядоченные данные - другое.
|
24.12.2017, 21:30 | #7 |
Регистрация: 10.12.2017
Сообщений: 5
|
Да отсортировать, а выводить я их все равно буду по 30 штук из массива, так как там памяти не хватит для вывод всех 8 миллионов строк в датагридвием.
|
24.12.2017, 21:33 | #8 | |
Регистрация: 10.12.2017
Сообщений: 5
|
Цитата:
А там по разрядам сравнивать в строке, по максимальному сзначению сред ариф в строке, и ранжировать ряды ... |
|
24.12.2017, 23:32 | #9 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,713
|
Тогда БД
|
24.12.2017, 23:54 | #10 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,065
|
Вариантов несколько:
1) Внешнюю сортировку можно под что угодно адаптировать. Для средних арифметических может придётся лишний раз файл перечитывать, но зато на выходе будет отсортированный файл, который можно будет относительно быстро читать кусками в грид и не нужно будет переупорядочивать при следующем запуске программы. 2) Файл в принципе подходит под формат csv, можно попробовать посмотреть в сторону OleDb провайдера который Microsoft Jet, он вроде умеет этот формат. Но я сомневаюсь, что этот провайдер как-то волшебным образом всё отсортирует на лету 3) Раз уж у нас пагинация нарисовывается, то просто при получении каждой порции данных читать весь файл построчно. При получении первых элементов всё просто. Читаем строку из файла, помещаем в свою упорядоченную коллекцию на соответствующее место. Если коллекция стала содержать больше 30 элементов, то удаляем последний. И так читаем все строки файла и на выходе будет первые 30 элементов. Немного заморочиться и можно будет сделать по этому принципу получение 3-й страницы из 30 элементов. Минус тут в скорости получения страниц данных - на каждый чих будет полностью файл перечитываться, но памяти много не будет нужно. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Программа для тестирования памяти, тестирование ячеек памяти | 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 |