Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Системное программирование > Поиск в большом файле


Автор: Гость_Владимир 21.5.2004, 15:17
Здравствуйте. Подскажите пожалуйста, как лучше искать в длинном файле (до 0,5 Мв), чтобы минимально нагружать сервер. В файле короткие записи разделенные специальными разделителями, которые можно просматривать по очереди. В результирующей странице появляются те записи, в которых найдено совпадение с образцом. Спасибо.

Автор: korob2001 21.5.2004, 15:38
Код

#!/usr/bin/perl -w
use strict;   # Не обязательно, но желательно
use warnings; # Не обязательно
my $path = 'file.txt';
open( F, "< $path" ) or die $!;
while ( <F> ) {
  if ( /pattern/ ) {
      # Делаем что-то со строкой
  }
}
close( F ) or die $!;

Удачи.

Автор: Secandr 23.5.2004, 10:20
korob2001 Я таким способом логи метров по 600 разбираю - весело smile.gif только там регекспы на две страницы smile.gif

Гость, а 0.5 мб - это маленький файл biggrin.gif

Автор: korob2001 23.5.2004, 12:19
Secandr Ты хочешь сказать, что такой способ не минимально нагружает сервер? Или вариант с сохранением в массив более оптимален? Я, например, считаю, что лучше привыкнуть обрабатывать файлы именно способом while ( <DESCRIPTOR> ) { };. Или я не прав?

Автор: Secandr 23.5.2004, 12:58
я не считаю, я знаю, что кроме чем while ( <DESCRIPTOR> ) { } 600мб не обработаешь smile.gif
Хотя нужно потестировать.
Лог 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мб в базу не должно занять более одного-двух дней.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)