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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> переписать скрипт shell на perl | опять регулярка 
:(
    Опции темы
ramus
Дата 4.5.2008, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 21.2.2008

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



попробовал
Код

$dir_src = eval "qq($dir_src)";

Ругается
Код

Error: while eval= - Global symbol "$disk_D" requires explicit package name at (eval 4) line 1.
Global symbol "$YYMMDD" requires explicit package name at (eval 4) line 1.

Это и понятно, так как я загружаю файл file_rules через do или require, а там свое адресное пространство, хотя имя пакета main я не переопределяю. Если в текущем блоке сказать our переменная, то тогда видит. 
Либо попытаться реализовать do своими силами что то типа eval (`cat  $file_rules`) то есть зачитать файл в текущем блоке.
Я остановился на первом варианте - тоесть выбираю все переменные в строке для eval и объявляю их в текущем блоке - все замечательно работает и не надо свой анализатор кода изобретать smile
PM MAIL   Вверх
amg
Дата 5.5.2008, 07:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(ramus @  4.5.2008,  19:19 Найти цитируемый пост)
Ругается
ramus, а так ли нужно в Вашем случае использовать прагму strict? У меня сложилось ощущение, что используя ее, Вы лишь создаете себе трудности, которые потом успешно преодолеваете. Т.е. она Вам скорее мешает, чем помогает.
PM MAIL   Вверх
ramus
Дата 5.5.2008, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 21.2.2008

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



Цитата

Т.е. она Вам скорее мешает, чем помогает. 


  smile 
Ну не знаю, тут привычка скорее. Просто в начале программирования на перл я без нее  столько ошибок наплодил без понимания. Считаю, что в промышленном коде она должна быть. Да и обошел я ее.  smile 

Тем не менее спасибо за помощь, ибо когда кончались идеи, новые я черпал здесь на сайте.
PM MAIL   Вверх
ramus
Дата 12.5.2008, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 21.2.2008

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



Уперся теперь в производительность :(
есть директория с 20 000 файлов

Код

  my @files_tmp1 = readdir $fdir; 


проходит менее чем за 1 секунду.
А вот проверка файл или директория (если директория, то добавить к имени файла "/") работает за 20-25 секунд. Код такой

Код

  my @files_tmp2;
  foreach (@files_tmp1) { 
    if ( $_ =~ '^\.\.? ) { next; } 
    if (-d "$dir_src/$_")            { $_ =~ s#$#\/# } 
    push @files_tmp2, $_;
  }


да к тому же мне нужно отобрать около 80 файлов по условию находящемуся в переменной $files ( зачитывается из конфигурационного файла)
$files=' ( $_ =~ m/^[rsa]4030/i ) && ( $_ !~ m{\/$} )'

Код

  my @files;
  foreach (@files_tmp2) { 
    if ( eval "$filter" ) { 
      write_log(" matched: $_\n") if $debug>2;
      push @files, $_; 
    } 
  }


этот блок еще работает секунд 12.

на этом же серваке, в этой же директории команда shell
ls -p $[dir_src} | grep -i '^[rsa]4030' | grep -v '/$'
отрабатывает менее чем за 1 секунду

что делать ? как ускорить?

пробовал сделать так

Код

  my @files;
  eval {
    foreach (@files_tmp2) { 
      if ( $filter ) { 
        write_log(" matched: $_\n") if $debug>2;
        push @files, $_; 
      } 
    }
  }


ругается на синтаксис
PM MAIL   Вверх
amg
Дата 13.5.2008, 07:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(ramus @  12.5.2008,  21:29 Найти цитируемый пост)
А вот проверка файл или директория (если директория, то добавить к имени файла "/") работает за 20-25 секунд. Код такой
Странно. У меня Ваш код отрабатывает за 0.1 с. Машина - далеко не суперкомпьютер. Файлов/директорий 20_000. Правда, все они пустые, но это, вроде, не должно влиять.

PS там в коде - опечатка if ( $_ =~ '^\.\.? ) 

PM MAIL   Вверх
ramus
Дата 13.5.2008, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 21.2.2008

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



Цитата

PS там в коде - опечатка if ( $_ =~ '^\.\.? ) 

Да, опечатался. Набирал из дома. Правильный код  if ( $_ =~ m/^\.\.?/ ) или  if ( $_ =~ m/^\.{1,2}/ ) 

Цитата

Машина - далеко не суперкомпьютер.

У меня тоже сервак древний. Возможно у меня задержки из за латентности, так как реально файловая система подцеплена по NFS с другого сервера и 20_000 проверок по сети делать дорого, вместо одного  запроса. Буду экспериментировать.

А вот как бы ускорить этот код, чтобы не делать 20_000 eval ?

Код

my @files;
  foreach (@files_tmp2) { 
    if ( eval "$filter" ) { 
      write_log(" matched: $_\n") if $debug>2;
      push @files, $_; 
    } 
  }


Результаты эксперимента: 
на локальной FS время работы 1 секунда на все
на FS по NFS время работы 1-2 секунды на чтение (readdir) + 6 !!! минут на проверку -d для 20_000 файлов
правда на серваке сейчас идет работа и соответственно сильная загрузка... вчера было 20-25 секунд.

Это сообщение отредактировал(а) ramus - 13.5.2008, 10:32
PM MAIL   Вверх
amg
Дата 13.5.2008, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(ramus @  13.5.2008,  08:25 Найти цитируемый пост)
А вот как бы ускорить этот код, чтобы не делать 20_000 eval ?
На самом деле эти 20_000 eval не так уж сильно замедляют:
Код
$filter = '-d "$dir_src/$_"';

# Отрабатывает за 0.1 с
eval '
foreach (@files_tmp1) { 
  if ( $_ =~ /^\.\.?/ ) { next; } 
  if ('.$filter.') {
    push @files_tmp2, $_;
  }
}
';

# Отрабатывает за 0.7 с
foreach (@files_tmp1) { 
  if ( $_ =~ /^\.\.?/ ) { next; } 
  if (eval "$filter") {
    push @files_tmp2, $_;
  }
}



PM MAIL   Вверх
ramus
Дата 13.5.2008, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 21.2.2008

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



Цитата

На самом деле эти 20_000 eval не так уж сильно замедляют:


у меня получилось 1/10, но 1 секунда против 10.
сервак ОЧЕНЬ старый HP L1000, частота процессора всего 450 МГц. Видимо дело в этом.
на персоналке выполняется в 10 раз быстрее.

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


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

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


 




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


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

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