![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| Blaga |
|
|||
![]() ЛамМер++ ![]() ![]() Профиль Группа: Участник Сообщений: 429 Регистрация: 15.11.2005 Где: г. Иркутск Репутация: 2 Всего: 4 |
Доброго времени суток.
Появился вопрос. Как лучше всего распарсить большой файл. Очень большой, от гига и больше вплоть до десяти наверное... Файл текстовый. Значит его нужно прочитать и удалить все повторяющиеся строки. То есть все строки должны стать уникальными. Конечно можно сделать в как обычно, брать первое слово и прогонять по файлу удаляя его, потом второе и т.д. Но файл у меня уж очень большой. Может быть есть какие нибудь другие средства? Интересует алгоритм и подсказки по функциям. Заранее большое спасибо. -------------------- |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Может написать все это на С++? 10 гиг парсинга и на нем будет конкретно тормозить
Алгоритм, в общем-то обычный -- читаем покусочно fopen,... fread(...,1024) ... в буферную строку. -- Из буферной строки выкусываем str_pos'ом положение символов конца строки, - получаем одну строку. -- для каждой строки запоминаем ее начало в файле, длину и crc32. crc сохраняем в индексном массиве. -- Если такой crc уже есть - перечитываем строчку и сравниваем побуквенно... Размер массива СRC для 10 гиг и длине строки в 80 символов будет 125 т штук... -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 75 Всего: 260 |
внешняя сортировка в ВИКИ
сортировка слиянием в ВИКИ правда, как сравнимо будет скорость сортировки в сравнении со скоростью индексирования(как предложил ksnk), оценвить не берусь. |
|||
|
||||
| Blaga |
|
|||
![]() ЛамМер++ ![]() ![]() Профиль Группа: Участник Сообщений: 429 Регистрация: 15.11.2005 Где: г. Иркутск Репутация: 2 Всего: 4 |
ksnk, если то что останеться от crc32 записывать в массив, то куда девать длинну строки и номер строки?
и еще а комп не загнеться от такого массива? например с 512 оперативки? skyboy, спасиб, почитал, подумаю над этим тоже. -------------------- |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Blaga, Нееее! когда я в уме пытаюсь скомбинировать php, текстовый парсинг и 10 гиговый файл с данными, у меня наступает мозговой клинч ...
Переписать на С все это добро, imho, значительно более жизнеспособная идея... Дергать её cgi или явным вызовом из скрипта... Насчет индексного массива, я имел ввиду чего-то такое
-------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Blaga |
|
|||
![]() ЛамМер++ ![]() ![]() Профиль Группа: Участник Сообщений: 429 Регистрация: 15.11.2005 Где: г. Иркутск Репутация: 2 Всего: 4 |
проблема в том что я очень плохо знаю C++
:( наверное придеться в спешном порядке это исправлять. -------------------- |
|||
|
||||
| Blaga |
|
|||
![]() ЛамМер++ ![]() ![]() Профиль Группа: Участник Сообщений: 429 Регистрация: 15.11.2005 Где: г. Иркутск Репутация: 2 Всего: 4 |
skyboy, там сортировка, а она мне не нужна. я говорил про повторки.
-------------------- |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Кстати, а откуда возникла такая задача? Просто текстовый файл в 10 гигов не каждая ОС потянет... Может ли такие файлы читать php, я, впрочем, тоже сомневаюсь.
-------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 75 Всего: 260 |
если тебе сортировка повредит(нужно сохранить порядок следования) - то да. в противном случае, удаление дубликатов и сводится к сортировке входящих данных: в таком случае удаление дубликатов будет произведено за один проход. В случае сортировки слиянием из двух файлов даже дополнительного прохода не потребуется. |
|||
|
||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |