Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/121: Рейтинг темы: голосов - 121, средняя оценка - 4.54
Заблокирован
1

Наиболее быстрый способ сортировки файла в 1 Тб при ограниченном объёме оперативной памяти

29.07.2015, 16:30. Показов 25253. Ответов 85
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет!
Какой есть наиболее быстрый способ сортировки файла, содержащего int-ы (по одному int-у на каждой строчке), размером в 1 террабайт, если на компе, к примеру, доступно всего 2 гб оперативки ... ?
Ну файл с нитами типа:
1
2
3
4
6346546
234524234
656546546
24234234
777
654646
и тд



Добавлено через 1 час 11 минут
Важная тема теряется... Up!

Добавлено через 4 часа 45 минут
Ну так что, никто не подскажет, как отсортировать 1 гиг в файле?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.07.2015, 16:30
Ответы с готовыми решениями:

Наиболее быстрый способ склеивания фрагментов файла
Имеется несколько фрагментов одного файла. Требуется собрать эти фрагменты в исходный файл. Размеры...

Наиболее быстрый способ записи в консоль
Какой наиболее быстрый способ отрисовки символов в консоли, если использовать исключительно WinAPI?...

Наиболее быстрый способ забрать данные из html
Мне нужно забрать данные с вебстранички. Там может содержаться просто одно слово, например "ОК", в...

Наиболее быстрый способ работы с файлом Excel (около 20000 строк)
Здравствуйте ребята, хотел спросить у вас совета. Есть программа по распечатке ценников по артикулу...

85
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
29.07.2015, 18:01 2
Файл текстовый?
1
Заблокирован
29.07.2015, 21:14  [ТС] 3
Цитата Сообщение от nmcf Посмотреть сообщение
Файл текстовый?
Хмм... а хз. Вот оригинальный текст вопроса:
You have a 1TB file containing integers (one number per line). You have 2GB of memory. How do you sort this file as fast as possible?

Судя по фразе: one number per line могу предположить, что текстовой ...

Добавлено через 3 часа 5 минут
nmcf, так ты подкинешь идейку, как эту сортировку получше реализовать?
0
1375 / 519 / 72
Регистрация: 21.07.2015
Сообщений: 1,304
29.07.2015, 21:27 4
Butt-Head, ну я бы сделал как-то так:
1.В цикле до конца файла:
1.1 Считать инты, сколько гарантированно влезет в память.
2.2. Отсортировать их быстрой сортировкой.
2.3 записать фрагмент во временный файл (обязательно в двоичном виде) с уникальным именем для (для фрагмента).
2. Последовательно попарно объединят файлы сортировкой слиянием. Когда останется 2 фрагмента - сливаешь в один текстовый.
1
Заблокирован
29.07.2015, 21:36  [ТС] 5
Цитата Сообщение от shmkv Посмотреть сообщение
Последовательно попарно объединят файлы сортировкой слиянием. Когда останется 2 фрагмента - сливаешь в один текстовый.
Объединять какие фалы?
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
29.07.2015, 21:37 6
Лучший ответ Сообщение было отмечено Butt-Head как решение

Решение

Вот была тема: Сортировка больших текстовых файлов размером до двух терабайт
1
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
29.07.2015, 21:44 7
Цитата Сообщение от Butt-Head Посмотреть сообщение
Объединять какие фалы?
Цитата Сообщение от shmkv Посмотреть сообщение
2.3 записать фрагмент во временный файл
...
1
Заблокирован
29.07.2015, 21:51  [ТС] 8
nmcf, я не очень въехал в чём там ваще фокус ...
Ну открыл ты кучу потоков, о одной строчке читаешь из каждого потока и пишешь в финальный поток...
Бред какой - то.
А что - то не помню, файловый поток в памяти занимает размер файлы или нет?
Вот тут нашёл кое что, но не понял суть опять же http://stackoverflow.com/quest... -hard-disk

Добавлено через 1 минуту
Цитата Сообщение от castaway Посмотреть сообщение
записать фрагмент во временный файл
Непонятно, как ты обойдёшь ограничение в 2 гб оперативки.

Как вообще, пусть даже не быстро, отсортировать файл в 1 террабайт?
0
163 / 104 / 14
Регистрация: 17.10.2012
Сообщений: 488
29.07.2015, 21:56 9
Лучший ответ Сообщение было отмечено Butt-Head как решение

Решение

Вот тут есть информация по теме + код,, можете глянуть
1
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
29.07.2015, 22:01 10
Цитата Сообщение от Butt-Head Посмотреть сообщение
Непонятно, как ты обойдёшь ограничение в 2 гб оперативки.
Я никак не буду обходить. Мне эта задача не интересна. Я лишь цитировал сообщение пользователя shmkv, которое ты пропустил.
0
70 / 64 / 40
Регистрация: 17.02.2014
Сообщений: 265
29.07.2015, 22:09 11
Лучший ответ Сообщение было отмечено Butt-Head как решение

Решение

Почему то хотел изначально отговорить от MergeSort, поскольку она требовательна к памяти, но видимо в данном случае без нее никак, кстати можно взять немного оптимизации из TimSort при склеивании двух фрагментов, в случае постоянного извлечения из одного подмассива брать следущий элемент галопом, так можно записывать в исходный массив целыми кусками.
0
Заблокирован
29.07.2015, 22:21  [ТС] 12
Цитата Сообщение от castaway Посмотреть сообщение
Я никак не буду обходить. Мне эта задача не интересна
Сама вакансия мне если честно то же не очень интересна, вот этот вопрос мне стал интересен чисто по профессиональному.
Интересно, может быть можно как - то вообще без вспомогательный файлов?
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
29.07.2015, 22:43 13
Цитата Сообщение от Butt-Head Посмотреть сообщение
Интересно, может быть можно как - то вообще без вспомогательный файлов?
Как вариант, алгоритм исключительно для WinAPI и для двоичного файла:
C++
1
2
3
4
5
6
7
8
    HANDLE hFile = CreateFile( "test", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL );
    DWORD dwSize = GetFileSize( hFile,  NULL );
    HANDLE hMap = CreateFileMapping( hFile, NULL, PAGE_READWRITE, 0, 0, NULL );
    int * p = (int *)MapViewOfFile( hMap, FILE_MAP_WRITE, 0, 0, 0 );
    std::sort( p, p + dwSize / sizeof( int ) );
    UnmapViewOfFile( p );
    CloseHandle( hMap );
    CloseHandle( hFile );
Проверил на файле 172 MB. Программа использовала не более 500кБ ОЗУ.
0
Заблокирован
29.07.2015, 22:51  [ТС] 14
Цитата Сообщение от castaway Посмотреть сообщение
Проверил на файле 172 MB. Программа использовала не более 500кБ ОЗУ.
Хмм... Я в принципе знал про это, но конечно же хотелось чего - то кроссового. Ну да ладно, для кроссового я так понял нужно External Merge Sort
Слушай, а по поводу Mapped файлов в WinApi, как то можно просчитать размер будущего проецируемого файла? Ну вот, допустим, какой объём потребуется для 1 Tb. ..
И вообще, как эта проекция физический работает, что - то я не пойму ... Небойсь через кеш в файл подкачки самой винды и на террабайте просто упадёт
0
1375 / 519 / 72
Регистрация: 21.07.2015
Сообщений: 1,304
29.07.2015, 22:54 15
Цитата Сообщение от Butt-Head Посмотреть сообщение
Объединять какие фалы?
Временные. Сливаешь попарно. В итоге образуется в 2 разв меньше файлов, но каждый файл в 2 раза большего размера.

Добавлено через 1 минуту
Цитата Сообщение от Butt-Head Посмотреть сообщение
Непонятно, как ты обойдёшь ограничение в 2 гб оперативки.
Цитата Сообщение от shmkv Посмотреть сообщение
Считать инты, сколько гарантированно влезет в память
...
0
Заблокирован
29.07.2015, 22:57  [ТС] 16
Цитата Сообщение от shmkv Посмотреть сообщение
Временные. Сливаешь попарно. В итоге образуется в 2 разв меньше файлов, но каждый файл в 2 раза большего размера.
Смотри. Вот есть у тебя три куска:
Первый: 0,7,3 [допустим размер 1 гб]
Второй: 4,2,8 [допустим размер 1 гб]
Третий: 9,0,8 [допустим размер 1 гб]

sort первых двух:
Первый: 0,3,7
Второй: 2,4,8

смерджил их:
merge1: 0,2,3,4,7,8 [2 гб]

что ты дальше будешь делать? Подгружать весь merg1 в память и сливать его с третьим куском? Тогда у тебя этот мердж кусок будет расти как на дрожжах и привет пямять ...
0
1375 / 519 / 72
Регистрация: 21.07.2015
Сообщений: 1,304
29.07.2015, 22:58 17
Цитата Сообщение от Butt-Head Посмотреть сообщение
ожет быть можно как - то вообще без вспомогательный файлов?
Можно, но будет ооочень долго.

Добавлено через 1 минуту
Цитата Сообщение от Butt-Head Посмотреть сообщение
Подгружать весь merg1
Чтобы сливать совсем необязательно грузить файл целиком.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
29.07.2015, 23:01 18
Цитата Сообщение от Butt-Head Посмотреть сообщение
Слушай, а по поводу Mapped файлов в WinApi, как то можно просчитать размер будущего проецируемого файла? Ну вот, допустим, какой объём потребуется для 1 Tb. ..
Его размер не меняется. Зачем его считать?

Цитата Сообщение от Butt-Head Посмотреть сообщение
И вообще, как эта проекция физический работает, что - то я не пойму ... Небойсь через кеш в файл подкачки самой винды и на террабайте просто упадёт
Детали не знаю. Может и упадёт.
0
1375 / 519 / 72
Регистрация: 21.07.2015
Сообщений: 1,304
29.07.2015, 23:01 19
Цитата Сообщение от Butt-Head Посмотреть сообщение
как это проекция физический работает, что - то я не пойму
Да работает она просто - при обращении к памяти #PF генерируется и ОС по этому адресу страницу из файла подгружает. Сам я никогда не использовал эту технологию. Но чудес-то не бывает, если памяти жрет мало, значит постоянно тасует страницы между диском и озу, что не особо благоприятно скажется на скорости.
0
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
29.07.2015, 23:10 20
Разбиваем на куски. Сортируем каждый кусок. Сразу сливаем все куски в выходной файл.

Как так сразу сливаем? Просто открываем все файлы. У каждого файла есть итератор на текущее число в нем. Выбираем наименьшее число среди всех итераторов. Пишем его в результирующий файл. Сдвигаем этот итератор на следующее число в этом файле. Снова выбираем наименьшее число среди итераторов. И так далее, пока все итераторы не дойдут до конца своих файлов.

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

Так как у нас там числа, то можем сортировать за O(n).
0
29.07.2015, 23:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.07.2015, 23:10
Помогаю со студенческими работами здесь

Наиболее быстрый способ сравнения двух экземпляров структур на предмет одинаковости их полей
Есть структура, в которой есть несколько int-ов и char-ов, какой имеется наиболее быстрый способ в...

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

Memory shift или самый быстрый способ перемещения блока памяти
int* dataField = new int{0}; for (int i = 0; i < 50; i++) dataField = 777; //тут должен быть...

Наиболее рациональный способ распределения памяти
Есть 2 HDD - 500 и 250 GB и внешний 1 TB. Будет стоять 2 ОС - Ubuntu и Windows 7 (и немного место...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru