The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"perl+mysql"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"perl+mysql"  +/
Сообщение от mesmeridze (ok) on 03-Авг-09, 15:27 
Просьба помочь новичку.
Есть перловый скриптик который извлекает данные из БД mysql, в которую я положил access.log (squid). Задача извлечь данные, отформатирывать и вогнать в другую чистую базу.
Результат работы нынешнего скриптика такой, если использовать LIMIT 1000000 то все работает (за исключением того что print отрабатывает раз в минуту, при этом наполнение базы err_r происходит по частям, часть в одну минуту через минуту еще часть и.т.д), если LINIT 60000000 (реальное кол-во записей в базе) или без лимита  то perl выедает всю доступную память, естественно как только он выгреб 90% свопа я его грохнул.
Вопрос такой: Как можно просматривать вывод каждой строчки при кажой интерации цикла и как можно избежать чрезмерного загребания памяти?

Сам скрипт:
#!/usr/bin/perl

# PERL MODULE WE WILL BE USING
use Mysql;
use DBI;
use DBD::mysql;
use Socket;

# MySQL CONFIG VARIABLES
$host = "localhost";
$database = "squid";
$table = "log";
$user = "root";
$pw = "";
$dbh = Mysql->connect($host, $database);

$query = "SELECT * FROM log";
$sth = $dbh->Query($query) or die $Mysql::db_errstr;


while (@full_row = $sth->FetchRow()) {
        $temp=$full_row[3];
        $query = "SELECT id FROM err_r WHERE err_name = '$temp'";
        $sterr = $dbh->Query($query) or die $Mysql::db_errstr;
        $qresult = $sterr->FetchRow;
        if ($qresult == NULL) {
                $query = "INSERT err_r VALUES (NULL,'$temp')";
                $dbh -> query($query);
        }
        $full_row[3]=$qresult;
        print "@full_row\n";
}
Заранее спасибо.
P.S


Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

  • perl+mysql, rstone, 17:07 , 03-Авг-09, (1)  
    • perl+mysql, mesmeridze, 17:09 , 03-Авг-09, (2)  
  • perl+mysql, angra, 03:43 , 05-Авг-09, (3)  

Сообщения по теме [Сортировка по времени | RSS]


1. "perl+mysql"  +/
Сообщение от rstone on 03-Авг-09, 17:07 

Я так понимаю что память жрет эта строка :

$query = "SELECT * FROM log";

Можно делать итерациями

select * from log limit 1000 offset 0 ;

затем

select * from log limit 1000 offset 1000 ;
select * from log limit 1000 offset 2000 ;

и так далее  , до тех пор пока все стоки не выбрали
(до offset <= select count(*) from log ) .

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "perl+mysql"  +/
Сообщение от mesmeridze (ok) on 03-Авг-09, 17:09 
>[оверквотинг удален]
>select * from log limit 1000 offset 0 ;
>
>затем
>
>select * from log limit 1000 offset 1000 ;
>select * from log limit 1000 offset 2000 ;
>
>и так далее  , до тех пор пока все стоки не
>выбрали
>(до offset <= select count(*) from log ) .

ага спасибо, на ум уже приходило (не мне) такое решение.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "perl+mysql"  +/
Сообщение от angra (ok) on 05-Авг-09, 03:43 
>use Mysql;
>Query
>FetchRow

Что это и зачем оно надо? Используйте стандартные методы DBI, а не обертки делающие неизвестно что. fetchrow_* как раз и нужны для извлечения по одной строке и предотвращения выжирания памяти. prepare+execute также могут существенно сократить время работы.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру