| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: Системное программирование > Поиск в большом файле |
| Автор: Гость_Владимир 21.5.2004, 15:17 |
| Здравствуйте. Подскажите пожалуйста, как лучше искать в длинном файле (до 0,5 Мв), чтобы минимально нагружать сервер. В файле короткие записи разделенные специальными разделителями, которые можно просматривать по очереди. В результирующей странице появляются те записи, в которых найдено совпадение с образцом. Спасибо. |
| Автор: korob2001 21.5.2004, 15:38 | ||
Удачи. |
| Автор: Secandr 23.5.2004, 10:20 |
| korob2001 Я таким способом логи метров по 600 разбираю - весело Гость, а 0.5 мб - это маленький файл |
| Автор: korob2001 23.5.2004, 12:19 |
| Secandr Ты хочешь сказать, что такой способ не минимально нагружает сервер? Или вариант с сохранением в массив более оптимален? Я, например, считаю, что лучше привыкнуть обрабатывать файлы именно способом while ( <DESCRIPTOR> ) { };. Или я не прав? |
| Автор: Secandr 23.5.2004, 12:58 |
| я не считаю, я знаю, что кроме чем while ( <DESCRIPTOR> ) { } 600мб не обработаешь Хотя нужно потестировать. Лог 600мб разбирается секунд за 20, с учётом того, что куча регекспов. |
| Автор: korob2001 23.5.2004, 14:14 |
| На мой взгляд, даже если файл весит 1MB, то его по возможности нужно обрабатывать именно вариантом while (<DESCRIPTOR>) { }, а не chomp( my @array = <DESCRIPTOR> ). Хотя работать с массивом гораздо проще, чем с файлом. |
| Автор: Secandr 23.5.2004, 14:24 |
| korob2001 Нужно смотреть по конкретной задаче: Если нужно раз в месяц читать файл и делать сложные манипуляции, то проще будет chomp( my @array = <DESCRIPTOR> ) Если нужно делать CGI, читающий файл немаленьких размеров лучше while (<DESCRIPTOR>) { }. Если нужно делать CGI, на ресурсе с высокой посещаемостью и фалами размером 10-50 мб, то есть смысл пользоваться базами данных, от стандартных dbm`ок (сохранять хеши), до MySQL. Гость_Владимир Может есть смысл использовать базы данных, он гораздо лучше справятся с выборкой информации, и не нужно будет изобретать велосипед. |
| Автор: Гость_Владимир 28.5.2004, 11:08 |
| Спасибо за ответы. Велосипед был изобретен в 98 году прошлого века и есть необходимость искать в файлах за шесть лет. Вариант с перенесением инфы другие базы рассматривал, но как представлю объем работы, то мне как-то плохеет. А как или чем определяется нагрузка на сервер? Какой критерий? Это будет использоваться на хобисстсом сайте и бесплатном хостинге. Не хотелось бы входить в конфликт с их тех. поддержкой. |
| Автор: korob2001 28.5.2004, 11:54 |
| Смотри сам вариант с массивом ( chomp( my @array = <DESCRIPTOR> ); ) сохраняет весь файл в оперативную память, вариант с циклом while ( while ( <DESCRIPTOR> ) { }; ) читает файл построчно, а не весь сразу. Вот теперь посмотри, какой из вариантов будет более оптимален в твоём случае. Если ты уверен что твой файл не разростётся до огромных размеров и он весит не много, 0.5MB - это не много, то конечно лучше воспользоваться вариантом с сохранением в массив, если же ты не знаешь сколько этот файл будет весить через месяц, то лучше воспользуйся вариантом с циклом while. Хотя насчёт базы данных я с Secandr, полностью согласен. Ещё многое зависит от того, что хранится в файле. Может стоит использовать старые и добрые DBM файлы. Удачи. |
| Автор: Secandr 29.5.2004, 09:25 |
| Вообще-то работы по написанию программы работающей с базой данных меньше, чем с файлами, да и работает быстрее, поскольку БД сама преобразует данные, поддерживает ключи,... А написать утилиту перегоняющую 0.5мб в базу не должно занять более одного-двух дней. |