![]() |
|
|
![]()
|
|
| Pori |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 50 Регистрация: 10.9.2007 Репутация: нет Всего: 1 |
Столкнулся с проблемой сортировки больших файлов.
Допустим есть файл, состоящий из целых чисел. Нужно его отсортировать. Но файл состоит не из 100 и не из 10000 записей, а намного больше. Размеры файла превышают 2 Гб. Не спрашивайте, зачем это нужно Возможно, есть возможность подстроить методы стандартных сортировок, таких как сортировки пузырьком, перестановкой, пирамидой и т.д. |
|||
|
||||
| Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 1 Всего: 37 |
если у тебя есть 2 гига оперативки свободной для твоего процесса - то сортируй quick sort. Если нет - то слиянием по Фон Нейману http://www.avhohlov.narod.ru/p2100ru.htm#msort |
|||
|
||||
| Pori |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 50 Регистрация: 10.9.2007 Репутация: нет Всего: 1 |
ммм спасибо, но тогда возникает еще один вопрос. У меня есть свой алгоритм сортировки для больших объемов данных, может кто знает - его опубликовал Крис Касперски. Так вот, с такими большими объемами, в силу того, что 2 гб и более оперативки не имею, работать нет возможности. Следовательно нужно разделять этот файл на n-ое кол-во частей, сортировать каждую из них, а далее их сливать. Так вот, есть ли алгоритмы слияния, и, если есть, какие из них наиболее эффективны для такого объема информации
Это сообщение отредактировал(а) Pori - 19.12.2007, 18:22 |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Ну собсно тупо режешь файл на куски такого размера, чтобы каждый кусок можно было взять полностью в память. Сортируешь каждый кусок по отдельности. Потом собираешь обратно слиянием, программно буферизуя чтение-запись в массивы-кольцевые буферы.
Преимущество - чтению с диска и записи на диск подлежит удвоенный объем исходного файла. А это (чтение-запись) куда как медленнее сортировки. PS. Лет, наверное, с 10 назад я реализовывал такую фигню еще на TBasic в ДОСе - сортировку файла порядка 50 Мбайт... резал на ломти по 56 кбайт (уж не помню почему именно так), qsort каждого куска... вполне шустренько получалось. Это сообщение отредактировал(а) Akina - 19.12.2007, 18:38 -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Pori |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 50 Регистрация: 10.9.2007 Репутация: нет Всего: 1 |
||||
|
||||
| stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: нет Всего: 48 |
Pori, файл состоит именно из целых чисел или это только для примера? если из целых, то в каком они диапазоне?
Добавлено через 21 секунду .. и есть ли повторы? -------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Я не заморачивался тогда теорией - буферизую клок каждого файла, по курсору на файл, из текущих элементов быстренько изыскиваем минимальный, спихиваем его в выходной поток и инкрементим соотв. курсор. Если где-то буфер опустел - подчитываем. Если входной буфер забился - скидываем. Все собсно.
А вообще stab прав - может, тебя устроит сортировка подсчетом? -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Pori |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 50 Регистрация: 10.9.2007 Репутация: нет Всего: 1 |
||||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Pori, если можно гарантировать, что массив уникальных значений списка поместится в памяти - сортировка подсчетом, и не надо обсуждать.
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| dereyly |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 217 Регистрация: 16.6.2006 Репутация: 1 Всего: 4 |
Я бы предложил сделать пороговую предобработку, т.е разделить на n групп k/n*(max-min)<A<(k+1)/n(max-min) трудоемкость 0(n) -- вычислить min и max и раскидать по группам, а потом эти группы можно легко склеить.
Недостаток то что группы получатся неравнозначными... но можно вычислить распределение данных и исправить это линейное разбиение min и max можно делать не полным перебором а брать каждое 100 значение, по статистике не сильно ошибемся... только нужно будет сделать две группы A(0)<min и A(n+1)>max Это сообщение отредактировал(а) dereyly - 20.12.2007, 01:09 |
|||
|
||||
| HistoryEarth |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 23.8.2007 Репутация: нет Всего: нет |
Любопытно, что это за данные, как хранятся.
У меня была когда-то, еще на 486 такая задача - решал тупо: - открывал файл - закачивал сколько можно - сортировал и сбрасывал, пока он не кончится. А потом сливал, ровно по Кнуту. |
|||
|
||||
| ikim |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 7.7.2008 Репутация: нет Всего: нет |
На самом деле быстрее читать большой файл сразу в бинарное дерево и скидывать его в файлы простым обходом дерева - тогда не нужна сортировка кусков.
|
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 2 Всего: 134 |
Во-первых тема старая, Во-вторых при больших объемах данных с памятью напряги. -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: нет Всего: 260 |
||||
|
||||
| DTL67 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 2.3.2009 Где: Russia, Krasnoyar sk Репутация: нет Всего: нет |
Эм... так как можно отсортировать файл с большим количество информации(Мой файл состоит из структур с фамилиями, именами, и другими данными.)?
Если использовать алгоритм слияния, то памяти потребуется сразу на все данные, ведь если его разделить на 2 части для сортировки, и так рекурсивно. То в результате получится 2 отсортированных массива с общим размером равным исходному файлу. Как его теперь можно будет отсортировать, если в оперативную память не уместятся ВСУ данные из файла? Даже на примере с теми же 2 Гб(А если будет больше: 10Гб, 100Гб и т.д) это сложно сделать. P.S: Попробовал сделать таким образом: Входные данные: в строке по 1 фамилии.(В данном примере, в дальнейшем будет много данных). 1) разбить файл на несколько частей(в примере на 10) и читать группами. 2) отсортировать каждый в алфавитном порядке методом пузырька и перезаписать в тот же файл(двоичный). И так до конца файла. 3) Потом начать с середины первой группы и перейти на 2 пункт. 4) Проделывать все это пока главный флажок(FLAG) поднят. Не знаю почему, но что то идет не так: либо получается 1 фамилия на весь файл записал кучу раз, либо еще что. Сама программа сначала из текстового файла читает данные и записывает во вновь созданный двоичный файл. И в этом самом файле происходит сортировка. Вот сам код:
В прикрепленном файле есть файл с этим кодом, и входные данные. Это сообщение отредактировал(а) DTL67 - 2.3.2009, 20:56 Присоединённый файл ( Кол-во скачиваний: 16 )
sort_file.rar 1,57 Kb |
||||
|
|||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |