Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

сортировка данных в очень больших файлах(больше 4 гиг)

31K
17 января 2009 года
charizma
29 / / 28.10.2008
Вощем тема, и раскрыла всю задачу. Если кто-то уже такое делал или есть идеи - можете плиз поделиться. Заранее благодарю :)
Вобщем я нашла кой-чего, но если можно поподробнее. или ссылку;)
2.5K
18 января 2009 года
OpenMind
10 / / 11.07.2005
Глядя на вопрос у меня предложение только одно - делать сортировку в несколько потоков.

1. Описываете функцию сортировки для одного фрагмента данных в большом файле:
DWORD __stdcall DataThread (void *param). Что будет внутри - чтение фрагмента данных из файла, алгоритм сортировки, запись отсортированных данных обратно в файл. Запись, я думаю, должна производиться с той же позиции, с которой производилось чтение необработанных данных.

2. Открываете большой файл с помощью CreateFile с флагом FILE_SHARE_READ.

3. Запускаете несколько параллельных потоков, описанных функцией DataThread, с помощью CreateThread. В качестве параметра для DataThread можно передать структуру. Поля этой структуры должны указывать смещение относительно начала большого файла и длинну обрабатываемого фрагмента.

В итоге получится что большой файл обрабатывается не целиком от начала до конца в одном потоке, а сразу делится на несколько частей, данные которых обрабатываются параллельно.
5
18 января 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: OpenMind
Глядя на вопрос у меня предложение только одно - делать сортировку в несколько потоков.

С одним файлом не поможет. Узкое место - не процессор. Диск.
Сортировать нужно в несколько этапов.

1) Разбиваем исходный файл на несколько меньших по размерам (200МБ) и сортируем их (можно быстрой сортировкой, можно сортировкой Шелла).

2) Производим объединение всех упорядоченных последовательностей (наших 200МБ-фйлов).

На каждом этапе в принципе допускается распараллеивание.

1.9K
18 января 2009 года
GreenRiver
451 / / 20.07.2008
При таких объемах стоит использовать базы данных...

А по существу: я бы даже сказал, что узкое место оператива+диск. Целиком массив в оперативку мы закинуть не можем (по крайней мере на 32 битных системах), следовательно надо делать, что предлагает Hardcase: дробить файл, а потом совмещать... Например просматривая поочередно по одному элементу в кусках собирать общий файл.
562
18 января 2009 года
tarekon
175 / / 19.08.2003
Самое сложное - аккуратно слить. Самым эффективным является использование сетей сортировки (иногда также называется "сетью компараторов слияния"). Отлично описано в Искусстве программирования Кнута.

Добавление
Оговорился. Сети эффективно использовать, когда невозможно на одном вычислительном узле хранить весь объем данных. Поэтому в данном случае, как сказал GreenRiver, можно поочередно просматривать все файлы. Точнее, открыть сразу все и считывать по элементу. Записывать в результат наименьший.
31K
19 января 2009 года
charizma
29 / / 28.10.2008
Спасиб всем. Буду начинать, что т делать... мдя...над еще как-то придумать подробить этот файлик правильно на части, отсортировать эти части, а потом как-то их меж собой... лана, что т придумаю. еще раз пасиб ;)
341
19 января 2009 года
Der Meister
874 / / 21.12.2007
[QUOTE=charizma]над еще как-то придумать подробить этот файлик правильно на части[/QUOTE]Спроецировать его в память
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог