Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка огромных данных 
:(
    Опции темы
Enelar
Дата 3.10.2010, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 13.1.2008

Репутация: нет
Всего: 1



Есть массив например структур размером x байт(пусть 50). Размер массива террабайт 10-20.
Вопрос как это чудо отсортировать.
Пусть у нас будет оперативка 2 гига и свободное место террабайт.
PM MAIL   Вверх
djamshud
Дата 3.10.2010, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: нет
Всего: 39



Встречный вопрос, откуда возьмется этот массив, если для него нет места?

Ну а вообще тут спасет т.н. компрессия без потери качества, т.е. в простейшем случае - сохранение не всех данных, а только уникальных плюс число раз их упоминания.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
okkonst
Дата 3.10.2010, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 5.9.2010
Где: Воронеж

Репутация: нет
Всего: 1



Цитата(Enelar @ 3.10.2010,  21:56)
Есть массив например структур размером x байт(пусть 50). Размер массива террабайт 10-20.
Вопрос как это чудо отсортировать.
Пусть у нас будет оперативка 2 гига и свободное место террабайт.

Я бы поэксперементировал с разреженными файлами http://ru.wikipedia.org/wiki/Разрежённый_файл. Соответственно, 2 файл-мэппинга, один - изначально полностью разреженный, второй - полностью забитый, данные постепенно перетекают из первого во второй. Может получиться... 

Вообще, ерунду гоню. Какая разница, сколько у тебя свободного места? Массив один, просто в нем записи перемещаются. Погляди, например, http://ru.wikipedia.org/wiki/Quicksort То есть, тебе нужно свободного места только для одной записи.

Это сообщение отредактировал(а) okkonst - 3.10.2010, 23:13
PM MAIL   Вверх
Pavia
Дата 3.10.2010, 23:29 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 6.12.2008

Репутация: 11
Всего: 12



Enelar
Используй сортировку слияниями.

Сортировка_слиянием

Правда сортироваться  будет пару месяцев.
Так что лучше закозать кластер.

Это сообщение отредактировал(а) Pavia - 3.10.2010, 23:31
PM MAIL   Вверх
okkonst
Дата 4.10.2010, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 5.9.2010
Где: Воронеж

Репутация: нет
Всего: 1



Цитата(Pavia @ 3.10.2010,  23:29)
Enelar
Используй сортировку слияниями.

Сортировка_слиянием

Правда сортироваться  будет пару месяцев.

Угу. И как ты предлагаешь сливать массивы при имеющемся 1 терабайте свободного места из потребных 15?
PM MAIL   Вверх
Pavia
Дата 4.10.2010, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 6.12.2008

Репутация: 11
Всего: 12



okkonst
Есть такая замечательная процедура как Truncate она обрезает файл без его перемещения. Сливать с конца файла порциями да хоть по 100мбайт. А потом переворот.
Перевороты можно делать виртуально меня знак сортировки.
PM MAIL   Вверх
okkonst
Дата 4.10.2010, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 5.9.2010
Где: Воронеж

Репутация: нет
Всего: 1



А в чем тут принципиальный выигрыш перед той же быстрой сортировкой? А геморроя значительно больше.  А с учетом использования FileMapping можно значительно выиграть за счет уменьшения числа дисковых операций, причем, об этом будет думать сама ось, а ей виднее smile

Это сообщение отредактировал(а) okkonst - 4.10.2010, 01:07
PM MAIL   Вверх
Pavia
Дата 4.10.2010, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 6.12.2008

Репутация: 11
Всего: 12



okkonst, Винда не поддерживает 10тб память. Так что придется тебе проецировать по частям. А даже если и поддерживало бы то при памяти в 2Гб имели бы кучу промахов. Т.е дисковых операций больше причем на порядки. Сортировка слияниями как раз нацелена на уменьшения дисковых операций.

Добавлено через 2 минуты и 37 секунд
Цитата(okkonst @  4.10.2010,  01:05 Найти цитируемый пост)
об этом будет думать сама ось, а ей виднее

Не надо думать что в ОС реализованы все алгоритмы. К чему бы им тогда каждый год  выпускали новую ОС?
PM MAIL   Вверх
okkonst
Дата 4.10.2010, 01:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 5.9.2010
Где: Воронеж

Репутация: нет
Всего: 1



Цитата

Винда не поддерживает 10тб память. Так что придется тебе проецировать по частям. 


Как раз, 2-я частями, со скольжением "окон отображения" к опорному элементу

Цитата

Сортировка слияниями как раз нацелена на уменьшения дисковых операций.


Ну, может, не знаю. На первый взгляд, мне показалось иначе

Цитата

Не надо думать что в ОС реализованы все алгоритмы. К чему бы им тогда каждый год  выпускали новую ОС?


Речь о том, что лучше ОС никто не знает, что свопить. Ну, или, скажем так, МАЛО кто smile 
PM MAIL   Вверх
Akina
Дата 4.10.2010, 07:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Цитата(Enelar @  3.10.2010,  22:56 Найти цитируемый пост)
Есть массив например структур размером x байт(пусть 50). Размер массива террабайт 10-20.

Это 20*2^40/50=4.4*10^11 элементов. При сортировке слиянием в 2 хода это получаются блоки по 660 тыс. элементов, 33 мегабайта - вполне сносно.
Только надо понимать, что на диске нужно иметь пустое пространство не менее, чем объём исходных данных. Иначе придётся усложнять процесс.
Цитата(Pavia @  4.10.2010,  01:40 Найти цитируемый пост)
А потом переворот

Только при условии что объём свободного пространства меньше объёма данных. И то - ты прав, переворот виртуальный, при двухпроходке на первой стадии, при трёхпроходке на второй.
Цитата(okkonst @  4.10.2010,  01:25 Найти цитируемый пост)
как ты предлагаешь сливать массивы при имеющемся 1 терабайте свободного места из потребных 15? 

Если свободного места недостаточно - потребуется трёхпроходное слияние. Но и при 1 терабайте свободного места и 20 терабайтах исходных данных получается вполне ничего...

Добавлено через 5 минут и 59 секунд
PS. Но я не могу представить себе пока практическую ценность подобного занятия.

Это сообщение отредактировал(а) Akina - 4.10.2010, 07:45


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
maxim1000
Дата 4.10.2010, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



реализовать быструю сортировку, только на файле (двунаправленную итерацию по элементам и обмен там сделать несложно)

когда сортируемые части массива будут становиться достаточно маленькими, можно попробовать читать их в память и сортировать там для ускорения


--------------------
qqq
PM WWW   Вверх
Enelar
Дата 5.10.2010, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 13.1.2008

Репутация: нет
Всего: 1



Ситуация очень простая. В течении нескольких лет в фаилы сливали инфу. Теперь скинули на один сервер у меня задача отсортировать.
Я тут подумал решает либо swap раздел, где можно с файлом работать как с оперативкой - меняя любой байт, либо отрезать от файлов по кусочкам.

Ответ на вопрос как свести количество дисковых операций - сортировка слиянием? спасибо.
P.S время не очень играет я сказал что раньше месяца не рассчитывайте.


PM MAIL   Вверх
Pavia
Дата 5.10.2010, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 6.12.2008

Репутация: 11
Всего: 12



Цитата(Enelar @  5.10.2010,  00:08 Найти цитируемый пост)
Ответ на вопрос как свести количество дисковых операций - сортировка слиянием? спасибо.

Во первых сортировка слиянием работает последовательно с файлами. Так что тут понятно что операций будет минимум. А чтобы их еще уменьшить надо сливать не 2 блока, а как можно больше.  К примеру 8.  Соответственно в алгоритме сортировки $O(n*Log_8(n))$ логарифм будет иметь основание 8 тем самым 2^38 данных понадобится всего 13 проходов против 38 (при скорости чтения диска 100мб\с один проход это день). 
Разбиваем все данные на файлы по 0.5 гигабайта.
Сортируем эти кусочки в памяти. Потом берем по 8 файлов и начинаем сливать.
Чтение и запись делать асинхронно, небольшими кусочками по 1-8 мбайт. Возможно организовать кэш с предвыборкой 8 ассоциативный.
Для повышения надежности вести логирование.  Было бы достаточно место можно без него. Перед тем как  что-то удалить записать на диск.
После прочтения делаешь конкатенацию файлов.  
При сливании 8 буферов смотришь в каком блоке наименьшее число больше наименьших чисел из других блоков. Max min(a[8]) сливаешь все числа которые выше этого числа потом читаешь буфер из этого файла.

Добавлено через 2 минуты и 2 секунды
PS. Больше 8 блоков процессор может не потянуть, скорости не хватит.
PM MAIL   Вверх
Enelar
Дата 5.10.2010, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 13.1.2008

Репутация: нет
Всего: 1



Да, спасибо. Теперь нужно узнать как отрезать фаил и где достать 2 бесперебойника (на всякий).
PM MAIL   Вверх
baldina
Дата 6.10.2010, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 4
Всего: 101



Цитата

 В течении нескольких лет в фаилы сливали инфу. 

эта инфа в отдельных файлах в беспорядке или как-то (например частично) упорядочена?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.1428 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.