![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
lamber |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 20.12.2008 Репутация: нет Всего: нет |
Снова здравствуйте, стоит вот такая вот задача, все бы нечего если бы объёмы файлов ООочень большие от 10кк до 100кк записей. Нужно удалить дубликаты строк в файле, это первая задача, вторая задача сделать выборку из больших файлов по заданной строке, НО нужно удалить еще выбранные строки из файлов. Надеюсь на вашу помощь.
|
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Читать построчно, подсчитать MD5 и хранить в каком нибудь контейнере типа std::set. Не повторяющиеся записать в другой файл. Все.
строки из файлов не удаляются, надо записать новый файл без этих строк. |
|||
|
||||
lamber |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 20.12.2008 Репутация: нет Всего: нет |
2azesmcar
а зачем считать md5 :? окей а как записать в тот же файл, перенести весь файл в оперативу а потом перезаписать или создавать временный файл оригинал удалять, а потом переименновывать временный :? Это сообщение отредактировал(а) lamber - 26.1.2011, 22:05 |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Для экономии памяти. MD5 в бинарном виде 16 байтов, в текстовом - 32. Теоретически твоя строка может состоять из сотни символов. создавать временный файл оригинал удалять, а потом переименновывать временный ![]() |
|||
|
||||
lamber |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 20.12.2008 Репутация: нет Всего: нет |
отчитываюсь по результатам, использовал контейнер set удобная штука, но есть проблема может кто слышал про тулзу KeyWordKeeper.exe достаточно удобная штука, вот я решил сравнить работу своей проги использующей stl set просеяв строки на уникальность и её в итоге 244мб файл прога порезала всего на 14 метров, а моя прога укаратила его аж на 160мб, я конечно рад бы думать что у меня-то на самом деле как нужно, но реалии обвчно говрорят обратное, может есть какая-то не учтенная мною особенность контейнера.
2azesmcar я не реализовывал md5 от строки т.к. это сложновато для меня реализовать, ну а тянуть либу Crypto++ и разбираться ней желания не было (хотя если выяснится что без этого ни как то я что поделаешь). |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
ты хранишь в set всю строку, оттого и такой расход памяти. А тянуть ничего не надо, в интернете полно реализаций md5, выбирай любую. http://stackoverflow.com/questions/1220046...-hash-of-a-file Это сообщение отредактировал(а) azesmcar - 27.1.2011, 18:04 |
|||
|
||||
lamber |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 20.12.2008 Репутация: нет Всего: нет |
Столько сам файл занимает, я больше переживают за то почему при использовании set<string> столько якобы дубликатов удаляет. Прогоняя тот же файл софтом который на этом специализируется получаю совершенно разные результаты.
|
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
lamber |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 20.12.2008 Репутация: нет Всего: нет |
|
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
lamber
Как все запутанно ![]()
|
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 15 Всего: 118 |
azesmcar, md5 слишком круто имхо для решения подобной задачи... кроме того даже она не обеспечивает истинности сравнения строк... тогда уж имхо хранить {хеш, длина, начальное смещение} и проверять соотвественно сначала хеш на уникальность, потом длину, потом побайтам ...
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
В каком смысле крут? В принципе можно и что нибудь попроще, но md5 дает хорошое распределение. ![]() этого не может обеспечить ни один хэш, тем не менее для более менее коротких строк md5 достаточно уникален, чтобы на него можно было положиться во многих ситуациях.
Да, конечно это замедлит процесс, в особенности если повторяющихся значений много, но если удаление НЕ эквивалентных строк в одном случае из миллионов - это катастрофа, то так и надо поступить. ![]() |
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 15 Всего: 118 |
не то чтобы сильно замедлит, если заменить md5 на что-то более быстрое. http://code.google.com/p/google-sparsehash/ вот какой-то хеш, говорят неплох по скорости... -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Ну замедление будет не за счет хеша, а за счет повторного чтения и сравнения самих строк. Поскольку этот процесс будет происходить только для повторов, то это будет скорее чувствоваться при большом множестве повторений. А есть какие-то про распределение (distribution), я что-то ничего не нашел. |
|||
|
||||
sQu1rr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 3 Всего: 13 |
Если такой случай один на миллион то и замедлится процесс в одну миллионную раза ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |