![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
rudolfninja |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 341 Регистрация: 19.2.2013 Где: г. Минск Репутация: 1 Всего: 6 |
Ребята, приветствую.
Ситуация: есть файл, в котором содержится очень много строк (от 250 000 до 300 000). Длина строки фиксированная - 30 байтов. Мне надо эти строки обрабатывать. Строки могут повторятся, поэтому сначала я оставляю только уникальные строки. Алгоритм такой: 1) Читаю из файла все строки в вектор:
2) Сортирую вектор:
3) Удаляю дубликаты строк:
Проблема в том, что с таким количеством строк программа валится на моменте сортировки. Вопрос вот в чем, подскажите, как можно правильно и корректно поступить в данной ситуации? Спасибо. P.S. В названии темы неправильно написано слово "unique". Прошу прощения. ![]() Это сообщение отредактировал(а) rudolfninja - 4.2.2016, 22:25 |
||||||
|
|||||||
Amp |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 886 Регистрация: 17.2.2009 Репутация: 3 Всего: 17 |
Если валится, то кэлстэк было бы неплохо приложить. Вектор у тебя из std::string? Компаратор какой-нибудь свой в std::sort передаешь?
|
|||
|
||||
rudolfninja |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 341 Регистрация: 19.2.2013 Где: г. Минск Репутация: 1 Всего: 6 |
Вектор из std::string, своего компаратора никакого не писал.
Блин, сейчас на компе была запущена только студия и все нормально отработало. Буду пробовать еще раз словить падение и скину колстек. |
|||
|
||||
leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: 1 Всего: 5 |
Если нужен sort+uniq, то сначала сортировать, а потом выбирать uniq - плохая идея. Лучше сразу вместо вектора использовать сет.
Раз длина строк фиксированная, значит std::string не нужен. Экономнее читать каждую строку в массив байтов. Этот ответ добавлен с нового Винграда - http://vingrad.com |
|||
|
||||
Sajtran |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 15.10.2008 Где: Мегион Репутация: нет Всего: 2 |
стэк для программы увеличь, QSort иногда много его жрёт или не стековую сортировку какую ни будь используй Этот ответ добавлен с нового Винграда - http://vingrad.com |
|||
|
||||
rudolfninja |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 341 Регистрация: 19.2.2013 Где: г. Минск Репутация: 1 Всего: 6 |
Ребят, с сортировкой разобрался. Оказывается, в программе, которая генерирует данные есть возможность писать их в файл уже отсортированными =)
Всем спасибо за ответы. Дальше слегка не по теме... Возник такой вопрос: очень медленно отрабатывает функция erase для вектора. Есть такой код:
Получается, что бывают моменты, что счетчик декрементируется, тем самым увеличивая время выполнения цикла. Этот цикл отрабатывает оооочень долго ![]() Есть варианты, как ускорить все это дело? Может использовать не вектор, а что-либо еще? Просто с моим количеством записей в этом векторе (около 250тыс) удаление занимает довольно длительное время...я бы даже сказал, что выполнение этого цикла сильно тормозит работу программы. Подскажите, пожалуйста, как ускорить сие действо? P.S. Элементы вектора отсортированы и важно сохранить это. Это сообщение отредактировал(а) rudolfninja - 5.2.2016, 21:11 |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
||||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Это ожидаемо. vector хранит элементы в линейном масиве памяти. erase приводит к перезаписи половины элементов (в среднем) Угу, лучше всего list. И еще лучше дать ему свой allocate, что бы элементы располагались в общем пуле памяти, а не насиловали общую кучу С++ ![]()
А это еще лучше ![]() |
|||
|
||||
rudolfninja |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 341 Регистрация: 19.2.2013 Где: г. Минск Репутация: 1 Всего: 6 |
В общем да, порешал проблему...чуток изменил алогритм и все летает.
Всем спасибо. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |