Модераторы: ginnie, korob2001
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск в большом файле 
:(
    Опции темы
Гость_Владимир
Дата 21.5.2004, 15:17 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 6
Всего: 61



Код

#!/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 $!;

Удачи.

Это сообщение отредактировал(а) korob2001 - 21.5.2004, 17:30


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Secandr
Дата 23.5.2004, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: нет
Всего: 39



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

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


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
korob2001
Дата 23.5.2004, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 6
Всего: 61



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


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Secandr
Дата 23.5.2004, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: нет
Всего: 39



я не считаю, я знаю, что кроме чем while ( <DESCRIPTOR> ) { } 600мб не обработаешь smile.gif
Хотя нужно потестировать.
Лог 600мб разбирается секунд за 20, с учётом того, что куча регекспов.


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
korob2001
Дата 23.5.2004, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 6
Всего: 61



На мой взгляд, даже если файл весит 1MB, то его по возможности нужно обрабатывать именно вариантом while (<DESCRIPTOR>) { }, а не chomp( my @array = <DESCRIPTOR> ). Хотя работать с массивом гораздо проще, чем с файлом.

Это сообщение отредактировал(а) korob2001 - 23.5.2004, 14:17


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Secandr
Дата 23.5.2004, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: нет
Всего: 39



korob2001 Нужно смотреть по конкретной задаче:
Если нужно раз в месяц читать файл и делать сложные манипуляции, то проще будет chomp( my @array = <DESCRIPTOR> )
Если нужно делать CGI, читающий файл немаленьких размеров лучше while (<DESCRIPTOR>) { }.

Если нужно делать CGI, на ресурсе с высокой посещаемостью и фалами размером 10-50 мб, то есть смысл пользоваться базами данных, от стандартных dbm`ок (сохранять хеши), до MySQL.


Гость_Владимир Может есть смысл использовать базы данных, он гораздо лучше справятся с выборкой информации, и не нужно будет изобретать велосипед.


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Гость_Владимир
Дата 28.5.2004, 11:08 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо за ответы. Велосипед был изобретен в 98 году прошлого века и есть необходимость искать в файлах за шесть лет. Вариант с перенесением инфы другие базы рассматривал, но как представлю объем работы, то мне как-то плохеет. А как или чем определяется нагрузка на сервер? Какой критерий? Это будет использоваться на хобисстсом сайте и бесплатном хостинге. Не хотелось бы входить в конфликт с их тех. поддержкой.
  Вверх
korob2001
Дата 28.5.2004, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 6
Всего: 61



Смотри сам вариант с массивом ( chomp( my @array = <DESCRIPTOR> ); ) сохраняет весь файл в оперативную память, вариант с циклом while ( while ( <DESCRIPTOR> ) { }; ) читает файл построчно, а не весь сразу.
Вот теперь посмотри, какой из вариантов будет более оптимален в твоём случае. Если ты уверен что твой файл не разростётся до огромных размеров и он весит не много, 0.5MB - это не много, то конечно лучше воспользоваться вариантом с сохранением в массив, если же ты не знаешь сколько этот файл будет весить через месяц, то лучше воспользуйся вариантом с циклом while.
Хотя насчёт базы данных я с Secandr, полностью согласен.
Ещё многое зависит от того, что хранится в файле. Может стоит использовать старые и добрые DBM файлы.

Удачи.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Secandr
Дата 29.5.2004, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: нет
Всего: 39



Вообще-то работы по написанию программы работающей с базой данных меньше, чем с файлами, да и работает быстрее, поскольку БД сама преобразует данные, поддерживает ключи,...
А написать утилиту перегоняющую 0.5мб в базу не должно занять более одного-двух дней.


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0685 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.