Автор Тема: скрипт выполняется 40 секунд  (Прочитано 5079 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн gad

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 28
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
скрипт выполняется 40 секунд
« : 12 Февраля 2003, 06:52:49 »
Это нормально?
Что делаю - вытаскиваю из mysql данные - 40000 записей (2 столбца).
И
foreach.
  простая математика
  график в картинке


прорисовку отключал время не уменьшилось.
Память не хавает, только процессорную мощность.
Машина 2-х процессорная

Оффлайн Metaller

  • Мелкое злобное существо
  • Ветеран
  • *****
  • Сообщений: 538
  • +0/-0
  • 2
    • Просмотр профиля
    • http://michael.pp.ru
скрипт выполняется 40 секунд
« Ответ #1 : 12 Февраля 2003, 09:55:50 »
совершенно не нормально. У меня подобное делается очень быстро..
Everybody\'s Got A Ticket To Ride Except For Me And My Lightning...

Оффлайн gad

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 28
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
скрипт выполняется 40 секунд
« Ответ #2 : 12 Февраля 2003, 10:40:33 »
1 колонка - координаты по X
2 колонка - координата по У
перебираю массив и рисую линию
картинка получается 600kB (размер 60000,600)
размер изменить не могу, могу только не рисовать - что и делал (не помогло)
Если массив маленький (10000 записей) время приемлемо.
Машина 2*PIII-1200 512кэш/ 4Гб ОЗУ.

Оффлайн Metaller

  • Мелкое злобное существо
  • Ветеран
  • *****
  • Сообщений: 538
  • +0/-0
  • 2
    • Просмотр профиля
    • http://michael.pp.ru
скрипт выполняется 40 секунд
« Ответ #3 : 12 Февраля 2003, 10:42:28 »
Код покажи
Everybody\'s Got A Ticket To Ride Except For Me And My Lightning...

Оффлайн gad

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 28
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
скрипт выполняется 40 секунд
« Ответ #4 : 12 Февраля 2003, 10:47:19 »
Вызывается из другой программы с параметрами.


// Устанавливаем масштаб (позже нужно его все-таки вычислять
// в зависимости от шага измерений) и названия выбираемых полей
// $diap - диапозон истинности кривых (все остальные данные игнорируем)
$k=18.51;

foreach ($id_key as $id => $value)
  {
   $y_opis=$y_opis+1;
   foreach ($value as $name => $cur)
   {$y_opis=$y_opis+1;}
  }
$y_opis=$y_opis*$k;


$y=ABS($k*($start-$stop))+100+$y_opis;
$ystart=$start;
$im=imagecreate(600,$y);
$black= ImageColorAllocate($im,0,0,0);
$white= ImageColorAllocate($im,255,255,255);
$setka= ImageColorAllocate($im,50,50,80);
imagefilledrectangle ($im,0,0,600,$y,$white);
$red = imagecolorallocate ($im, 255, 0, 0);

/* Рисует пунктирную линию: 5 красных пикселов, 5 белых */
$style = array ($setka,$setka,$setka,$setka,$setka,$white,$white,$white,$white,$white);
imagesetstyle ($im, $style);


$j=0;
//Рисуем глубины (координатная сетка)
$glubina=(int)$ystart;

$im_line=new_im(0,0,0);
imagesetbrush ($im, $im_line);

for ( $y1=0 ; $y1 < ($y-150) ; $y1=$y1+$k ) {
   IF (($glubina/10)==(int)($glubina/10))
     {
     imagestring ($im,4,0,$y1+50+$y_opis,"$glubina",$black);
     imageline($im,40,$y1+50+$y_opis,550,$y1+50+$y_opis,$setka);
     }
   ELSE
     { imageline($im,50,$y1+50+$y_opis,550,$y1+50+$y_opis,IMG_COLOR_STYLED);}
   $glubina=$glubina+1;
   }


for ( $x1=0 ; $x1 < 500; $x1=$x1+20 )
   {
    imageline($im,$x1+50,50+$y_opis,$x1+50,$y-100+$y_opis,IMG_COLOR_STYLED);
   }

imageline ($im,50,50+$y_opis,550,50+$y_opis, IMG_COLOR_STYLEDBRUSHED);
imageline ($im,50,$y-100+$y_opis,550,$y-100+$y_opis, IMG_COLOR_STYLEDBRUSHED);

imageline($im,50,50+$y_opis,50,$y-100+$y_opis,IMG_COLOR_STYLEDBRUSHED);
imageline($im,$x1+50,50+$y_opis,$x1+50,$y-100+$y_opis,IMG_COLOR_STYLEDBRUSHED);



$r=10;
$g=255;
$b=255;
$y_st=30;

foreach ($id_key as $id => $value)
  {
   foreach ($value as $name => $cur)
   {
   $im_line=new_im($r,$g,$b);
   call_user_func (\'do_curve\',$id,$cur,$k,$name,$im,$y_st,$im_line,$ystart,$y_opis);
   $r=$r+80;if ($r>255) {$r=20;}
   $g=$g-55;if ($g<0) {$g=240;}
   $b=$b-85;if ($b<0) {$b=240;}
   $y_st=$y_st+20;
   }
  }




function new_im($r,$g,$b)
  {
  $im_line=imagecreate(2,2);
  $col=registercolor($im_line,$r,$g,$b);
  imagefilledrectangle ($im_line,0,0,2,2,$col);
  return $im_line;
  }

function registercolor($im,$r,$g,$b)
  {
  $color=imagecolorexact($im,$r,$g,$b);
  IF ($color==-1)
   {
   $color= ImageColorAllocate($im,$r,$g,$b);   
   }
  return $color;
  }

function do_curve($id,$cur,$k,$name,$im,$y_st,$im_line,$ystart,$y_opis)
  {

   $sql="SELECT nul_var,date FROM opis_las WHERE uid=$id;";
   $result = MYSQL_QUERY($sql);
   $row = mysql_fetch_row($result);
   $nul_var=$row[0];
   $date_las=$row[1];
   mysql_free_result($result);

   $sql="SELECT MAX($cur),MIN($cur) FROM las WHERE uid=$id and !($cur=$nul_var);";
   $result = MYSQL_QUERY($sql);
   $row = mysql_fetch_row($result);
   $x=($row[0]-$row[1]);
   $xmax=$row[0];
   $xmin=$row[1];
   //вычисляем коэффициент по X
   $kx=400/$x;
   //вычисляем смещение по X
   // если минимальное значение отрицательное
   // или большое положительное
   $x_dop=0-$xmin;
   mysql_free_result($result);
   
   //Читаем из бызы данных и рисуем картинку
   //
   //
   //
   //
   $sql="SELECT strt,stop,step,nul_var FROM opis_las WHERE uid=$id;";
   $result = MYSQL_QUERY($sql);
   $row = mysql_fetch_row($result);
   $nul_var=$row[3];
   mysql_free_result($result);

   $sql="SELECT curve1,$cur FROM las WHERE uid=$id order by 1;";
   $result = MYSQL_QUERY($sql);
   //перебираем массив и вычисляем координаты точек для линии
   $count=mysql_num_rows($result)-1;
   for ($i = 0; $i < $count; $i++)
         {
         mysql_data_seek($result, $i);
         $row = mysql_fetch_row($result);
   //проверяем на истинность данных
         if ($row[1]==$nul_var) {continue;}
         $y1=($row[0]-$ystart)*$k+$y_opis;
         $x1=($row[1]+$x_dop)*$kx;

         $j=$i+1;
         mysql_data_seek($result, $j);
         $row = mysql_fetch_row($result);
   //проверяем на истинность данных
         if ($row[1]==$nul_var) {continue;}
         $y2=($row[0]-$ystart)*$k+$y_opis;
         $x2=($row[1]+$x_dop)*$kx;


   // рисуем отрезок
         if ($x1==$x2 AND $y1==$y2) {continue;}
         imagesetbrush ($im, $im_line);
         imageline ($im,$x1+50,$y1+50,$x2+50,$y2+50, IMG_COLOR_STYLEDBRUSHED);
         }
   //Рисуем эталонный отрезок
   $xmin=round($xmin,2);
   $xmax=round($xmax,2);
   imageline ($im, ($x_dop+$xmin)*$kx+50, $y_st, ($x_dop+$xmax)*$kx +50, $y_st, IMG_COLOR_STYLEDBRUSHED);
   imagestring ($im,2,(($x_dop+$xmin)*$kx)+50,$y_st-13,"$xmin >   $name $date_las < $xmax",$black);
  }


imagepng($im);
imagedestroy($im);
?>

Оффлайн Metaller

  • Мелкое злобное существо
  • Ветеран
  • *****
  • Сообщений: 538
  • +0/-0
  • 2
    • Просмотр профиля
    • http://michael.pp.ru
скрипт выполняется 40 секунд
« Ответ #5 : 12 Февраля 2003, 10:54:27 »
Цитировать

mysql_data_seek($result, $i);
$row = mysql_fetch_row($result);

$j=$i+1;
mysql_data_seek($result, $j);
$row = mysql_fetch_row($result);


ЗАЧЕМ?????

почему просто не вызываешь два раза?
$row = mysql_fetch_row($result);

хотя, дело, наверное, не в этом..
Everybody\'s Got A Ticket To Ride Except For Me And My Lightning...

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://

Оффлайн gad

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 28
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
скрипт выполняется 40 секунд
« Ответ #7 : 12 Февраля 2003, 12:55:18 »
Если я правильно понял ссылку то Дмитрий Котеров утверждает, что буде гораздо быстрее если
1.сформировать файл средствами mysql
2. прочитать этот файл из PHP.

не логично, хотя попробую...

Оффлайн gad

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 28
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
скрипт выполняется 40 секунд
« Ответ #8 : 13 Февраля 2003, 08:58:06 »
Путем многочисленных экспериментов вычислил следующее:
1 Эти 2 оператора работают крайне - медленно
         mysql_data_seek($result, $i);
         $row = mysql_fetch_row($result);
2 Если перебирать по порядку,без передвижения указателя, работает в 10 раз быстрее
(так и сделал, теперь за 4-5 секунд тот-же график)

3 Если делать как предлагает господин Дмитрий Котеров
на http://www.xpoint.ru/cgi-bin/forum....thread&id=16531
ощутимой разницы нет.
 а) Если Двигать указатель в файле - еще медленнее
 b) нужны права на запись что не есть гуд

Прав оказался  Metaller  , правда код немного поправил.

Спасибо мужики, в 10 раз быстрее работа - это круто

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28