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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> дописать из файла в базу 
:(
    Опции темы
shamber
Дата 25.1.2010, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Egik2 @  25.1.2010,  09:57 Найти цитируемый пост)
что prepare statement наоборот помогает

я в этом не сомневаюсь, я говорю, что их нужно использовать, а не каждый раз по новой выполнять
PM MAIL Jabber   Вверх
Egik2
Дата 25.1.2010, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 302
Регистрация: 29.7.2008
Где: Агудзера

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



Ну ведь он, это и советует:
Не надо:
Цитата(ramus @  24.1.2010,  16:34 Найти цитируемый пост)
while(<LOG>){
    my ($ip_temp, $host_temp, $string_temp) = split(/\|/, $_);
$query = "INSERT INTO log (ip, host, string) VALUES ('".$ip_temp."', '".$host_temp."', '".$string_temp."')";
$query_handle = $connect->prepare($query);
$query_handle->execute();
}


То есть prepare происходит для каждой записи, что неправильно - и по идее одно и то же, что вставка без prepare.
И как должно быть 

Цитата(ramus @  24.1.2010,  16:34 Найти цитируемый пост)
my $query = "INSERT INTO log (ip, host, string) VALUES (?, ?, ?)";
$query_handle = $connect->prepare($query);

while(<LOG>){
    my ($ip_temp, $host_temp, $string_temp) = split(/\|/, $_);
   $query_handle->execute($ip_temp, $host_temp, $string_temp);
}


То есть идет подготовка выражения с самого начала, а потом используется подготовленное.

Разве это не правильно?


--------------------
Три великие добродетели программиста: лень, нетерпение и самомнение (Larry Wall)
a-nav.com
developer-blog.ru
world-poetry.org
PM MAIL WWW ICQ   Вверх
shamber
Дата 25.1.2010, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



ramus, предложил верное решение.
позднее время, а также то,что чукча писатель, а не читатель(чукча -> я), и не позволило, вам увидеть эту мысль в моей фразе.
Каюсь
PM MAIL Jabber   Вверх
ramus
Дата 26.1.2010, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



"хоть проц 2 ядра и рама 4 гига ."

У нас особо "одаренные" программисты таким образом "напрягали" гораздо более крутой сервер - 8 двухядерных итаниумов с 64 гигами оперативки.
Я не говорю, что это предложение панацея от всего, но то, что надо один раз отпарсить SQL, а потом многократно использовать с разными данными-это существенно облегчит жизнь серверу и админу.

"что prepare statement наоборот помогает, позволяет держать базе в кэше объект SQL statement, что избавляет от необходимости
каждый раз парсить запрос."
Как раз в Вашем варианте происходит парсинг для каждой строки лога, так как каждый раз строка разная, например
INSERT INTO log (ip, host, string) VALUES ('1.1.1.1', 'host_temp', 'string')
INSERT INTO log (ip, host, string) VALUES ('2.2.2.2', 'host_temp', 'string')

В предложенном мной варианте парсинг (в том числе определение плана выполнения) выполняется один раз, 
INSERT INTO log (ip, host, string) VALUES (:ip, :host, :string)
в области хранения SQL запросов ( SQL area) будет только ОДНА строчка (от нашей сессии). Число execute для нее будет равняться числу строк в логе.

В Вашем же случае число строк в sql area БД будет равно числу строк в логе и для каждой такой строки число execute будет =1.

PS
Лучше много раз по разу, чем ни разу много раз ;)
PM MAIL   Вверх
box
Дата 26.1.2010, 06:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



пишу следующее :
Код

$query = "SELECT COUNT(*) FROM log";
$query_handle = $connect->prepare($query);
$query_handle->execute();
$query_handle->bind_columns(\$count);
$query_handle->fetch();
$cnt=$count+1;
$c=1;

#####################

open(LOG, "/var/log/access.log") or die "Can't open log $!";

my $query = "INSERT INTO log (ip, host, string) VALUES (?, ?, ?)";
$query_handle = $connect->prepare($query);

my %hash = ();
while(<LOG>){
    my ($ip_temp, $host_temp, $string_temp) = split(/\|/, $_);
        $hash{$host_temp."|".$ip_temp."|".$string_temp}++;
if($c>$cnt){
 $query_handle->execute($ip_temp, $host_temp, $string_temp);
        }
$c++;
}

такой вариант работает только в том случае если лог не обноляется , но у меня он периодически обнуляется и получается что новая запись в базе не добавится пока кол-во строк в новом файле не будет больше чем  кол-во записей в базе , вообщем бред получается .
вообщем вопрос номер один "как определить что лог обновился а не просто еще не успел набрать того кол-ва строк что в базе"
PM MAIL   Вверх
shamber
Дата 26.1.2010, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(box @  26.1.2010,  06:29 Найти цитируемый пост)
$cnt=$count+1;

Цитата(box @  26.1.2010,  06:29 Найти цитируемый пост)
if($c>$cnt){

Цитата(box @  26.1.2010,  06:29 Найти цитируемый пост)
$c++;


У вас тут с логикой все совершенно жестко. Вам предложили пару вариантов, но вы их не хотите использовать, вместо этого изобретаете велосипед, и удивляетесь что ничего не работает. 
Чем Вам не нравится вариант с seek?

Добавлено @ 11:29
Цитата(box @  26.1.2010,  06:29 Найти цитируемый пост)
о у меня он периодически обнуляется

ну добавьте в скрипт, чтение параметров файла, к примеру время последней модификации. и все проблемы решены

Это сообщение отредактировал(а) shamber - 26.1.2010, 11:30
PM MAIL Jabber   Вверх
ginnie
Дата 26.1.2010, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



box, у меня вот какой вопрос возник: если у Вас лог периодически обнуляется и этот процесс никак не завязан со скриптом, Вы, случайно, часть данных не теряете (которые добавилась после запуска скрипта, но до обнуления лога)?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
box
Дата 26.1.2010, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



"ну добавьте в скрипт, чтение параметров файла, к примеру время последней модификации. и все проблемы решены"

к сожалению это проблемы не решает потому как время модификации файла будет меняться каждый раз когда добавляется новая строка файла. у меня была идея создавать lock файл или запись в бд о том что файл обновлен и потом соответсвующим образом обрабатывать лог но это займет больше ресурсов.
PM MAIL   Вверх
shamber
Дата 26.1.2010, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(box @  26.1.2010,  17:02 Найти цитируемый пост)
модификации файла будет меняться каждый раз когда добавляется новая строка файла

Цитата(box @  26.1.2010,  17:02 Найти цитируемый пост)
запись в бд о том что файл обновлен 

Цитата(box @  26.1.2010,  17:02 Найти цитируемый пост)
потом соответсвующим образом обрабатывать лог

что в моем предложении, мешает осуществить перечисленное вами?


Это сообщение отредактировал(а) shamber - 26.1.2010, 17:05
PM MAIL Jabber   Вверх
arto
Дата 26.1.2010, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



интересно, когда вы повторите функциональность обыкновенного tail?
который может следить хоть за дескриптором, хоть за именем...
PM MAIL ICQ   Вверх
box
Дата 26.1.2010, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



приведите пожалуйста пример использования tail  в перле , а то я нашел только для командной строки .
PM MAIL   Вверх
klem4
Дата 26.1.2010, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А почему не хотите использовать tail коммандной строки из perl ? 
PM MAIL   Вверх
arto
Дата 26.1.2010, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



tail | perl самое простое.
либо perldoc -f open
PM MAIL ICQ   Вверх
klem4
Дата 26.1.2010, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Дак можно прямо в перл получать результат tail

Код

my $some_result = `tail ...`;

PM MAIL   Вверх
arto
Дата 26.1.2010, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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


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

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


 




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


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

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