Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Увеличение времени выполнения, Почему? 
:(
    Опции темы
fess
Дата 15.4.2005, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.2.2005
Где: г. Мурманск, Росс ия

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



Я, конечно, понимаю, что телепатов среди вас нет, но может кто-нибудь сможет помочь. smile
Суть проблемы:
Имеется процедура, которая обращается к базе данных Paradox через BDE. Она делает выборку, затем считывает результат в динамический массив.

Действия с БД, которые производит данная процедура:
-выборка данных (Select) из небольших таблиц (~500 записей);
-создание временных таблиц через API (DBIMakePermanent), так как Paradox не поддерживает представления.

Из динамических типов данных используется только динамические массивы.

При последующих обращениях к ней происходит постоянное увеличение времени выполнения (хотя эта процедура выполняет одни и те же действия). smile

Я пытался изменить настройки BDE (может кто-нибудь посоветовать оптимальные настройки), но только хуже стало, может, не хватает кэш-памяти. smile
В принципе могу привести код участка процедуры, но не думаю, что это поможет
--------------------
Компьютер не подчиняется законам физики. Только в нём глюки возникают из ничего, файлы исчезают в никуда, а объём измеряется в метрах и называется весом.
PM MAIL ICQ   Вверх
SPrograMMer
Дата 15.4.2005, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Спамер :)
**


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

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



Цитата(fess @ 15.4.2005, 18:57)
создание временных таблиц через API (DBIMakePermanent), так как Paradox не поддерживает представления

УГУ! А где ж твои временные таблицы. на диск сохраняются?
Цитата(fess @ 15.4.2005, 18:57)
В принципе могу привести код участка процедуры, но не думаю, что это поможет

Желательно.


--------------------
животное = зверь
законченный гентушник
PM MAIL ICQ Jabber   Вверх
fess
Дата 15.4.2005, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.2.2005
Где: г. Мурманск, Росс ия

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



Цитата
УГУ! А где ж твои временные таблицы. на диск сохраняются?

Они сохраняются в папке с самой базой данных.

Участок кода (из него вырезана, по моему мнению, ненужная часть):

Код

    procedure PrepareForOneYearBi_Sij(YearId,VariantsId, NumIndex, NumAgeOfVictim:integer);
    const
      {Шаблон запроса}
      Template_S_B_SQL='select Sum(Weight)*Sij  As S_B, YearCod,FirstHalf,SecondHalf, DataYear, Age '+
                    ' from %s F, "Sij" S'+    //"Sij" - временная таблица, которая создаётся в другой процедуре
                    ' Where VariantsId=%d and '+
                    ' YearId=%d and '+
                    ' S.DataYear=F.DataYear '+
                    ' %s ' +
                    ' Group by YearCod,FirstHalf,SecondHalf, DataYear, Age ';


    var
//объявлене всяких переменных
    begin

      {Вычисление и заненсение в массив произведения Sij на Bi}
      StomackModule.Query1.Close;
      StomackModule.Query1.sql.Clear;

      {Добаление запроса в TQuerry}
      StomackModule.Query1.sql.Add(Format(Template_S_B_SQL, [BiomTableName, VariantId, YearId, 'and S.Age=F.' + Param]))

      t := GetTickCount;//Замечаем время

      StomackModule.Query1.Open;

      MegaTik:= MegaTik+(GetTickCount - t);
      // Накапливаем время выполнения в глобальную переменную, т.к. несколько раз вызывается процедура. Тут время выполнения и увеличивается

      {заполнения динамического массива данными}
      if Not(StomackModule.Query1.Fields[0].IsNull)
      then begin
        SetLength(ArrayOf_Sij_Bi,Length(ArrayOf_Sij_Bi)+NumAgeOfVictim );
        while not (StomackModule.DataSource1.DataSet.Eof)
        do begin
          TempYear := StomackModule.DataSource1.DataSet.Fields[1].AsInteger;
          TempData := StomackModule.DataSource1.DataSet.Fields[0].AsFloat;
          FH:=StomackModule.DataSource1.DataSet.Fields[2].AsBoolean;
          SH := StomackModule.DataSource1.DataSet.Fields[3].AsBoolean;
          DY:=StomackModule.DataSource1.DataSet.Fields[4].AsBoolean;
          TempAge:=StomackModule.DataSource1.DataSet.Fields[5].AsInteger;

          if FH then ArrayOf_Sij_Bi[Length(ArrayOf_Sij_Bi) -NumAgeOfVictim -1 +TempAge][1][TempYear]:=TempData;
          if DY then ArrayOf_Sij_Bi[Length(ArrayOf_Sij_Bi) -NumAgeOfVictim -1 +TempAge][0][TempYear]:=TempData;
          if SH then ArrayOf_Sij_Bi[Length(ArrayOf_Sij_Bi) -NumAgeOfVictim -1 +TempAge][2][TempYear]:=TempData;

          StomackModule.DataSource1.DataSet.Next;
        end;

      end;


Это сообщение отредактировал(а) fess - 15.4.2005, 20:24
--------------------
Компьютер не подчиняется законам физики. Только в нём глюки возникают из ничего, файлы исчезают в никуда, а объём измеряется в метрах и называется весом.
PM MAIL ICQ   Вверх
fess
Дата 24.4.2005, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.2.2005
Где: г. Мурманск, Росс ия

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



Ну, раз ни у кого нет никаких предложений, попробую сформулировать вопрос по-другому.
Так как при перезапуске приложения скорость выполнения этой процедуры опять становится минимальной (т.е. при первом вызове скорость выполнения нормальная), то возникает вопрос:
Что происходит с БД при закрытии приложения и как выполнить эти действия во время работы приложения?

--------------------
Компьютер не подчиняется законам физики. Только в нём глюки возникают из ничего, файлы исчезают в никуда, а объём измеряется в метрах и называется весом.
PM MAIL ICQ   Вверх
bursa
Дата 25.4.2005, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(fess @ 15.4.2005, 20:22)
SetLength(ArrayOf_Sij_Bi,Length(ArrayOf_Sij_Bi)+NumAgeOfVictim
По всей видимости здесь поблема.
Увеличивай длину сразу на количество записей.
Кстати, может ускорить, если перед всей операцией установить длину массива в ноль

Код

SetLength(ArrayOf_Sij_Bi,0);
SetLength(ArrayOf_Sij_Bi,Length(ArrayOf_Sij_Bi)+NumAgeOfVictim 

PM MAIL   Вверх
fess
Дата 25.4.2005, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.2.2005
Где: г. Мурманск, Росс ия

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



Цитата(bursa @ 25.4.2005, 14:10)
По всей видимости здесь поблема.

Это здесь совершенно не причём. Возможно, я не так объяснил или ты не так понял. Я засекаю только то время, котрое требуется на выполнения запроса (и оно увеличивается), т.е. я не смотрю, сколько времени тратится на создание динамического массива и на заполнеия его данными.


--------------------
Компьютер не подчиняется законам физики. Только в нём глюки возникают из ничего, файлы исчезают в никуда, а объём измеряется в метрах и называется весом.
PM MAIL ICQ   Вверх
Vit
Дата 1.5.2005, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

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



Кстати парадокс поддерживуает представления... Создай на диске файл с расширением sql и содержимым в ввиде SQL запроса. Теперь можешь к этому файлу обращаться как к таблице...


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
fess
Дата 2.5.2005, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.2.2005
Где: г. Мурманск, Росс ия

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



Цитата
Кстати парадокс поддерживуает представления... Создай на диске файл с расширением sql и содержимым в ввиде SQL запроса. Теперь можешь к этому файлу обращаться как к таблице...

Я эту фишку знаю, но, к сожалению, каждый разогда ты используешь этот SQL-запрос, он заново вычисляется smile . Таким образом, если я несколько раз использую этот SQL в запросах, время выполнения ещё больше увеличивается.
--------------------
Компьютер не подчиняется законам физики. Только в нём глюки возникают из ничего, файлы исчезают в никуда, а объём измеряется в метрах и называется весом.
PM MAIL ICQ   Вверх
Dr.No_xXx
Дата 2.5.2005, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата
// Накапливаем время выполнения в глобальную переменную, т.к. несколько раз вызывается процедура. Тут время выполнения и увеличивается

Если я правильно понял то ты вызываешь процедуру несколько раз в 1 программе.А по сему где твое закрытие?
PM MAIL   Вверх
fess
Дата 2.5.2005, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.2.2005
Где: г. Мурманск, Росс ия

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



Цитата
Если я правильно понял то ты вызываешь процедуру несколько раз в 1 программе.

Да, можно и так сказать. На самом деле эта процедура вызывается 5-10 раз из другой процедуры, которая несколько раз вызывается при нажатии на кнопку smile
Цитата
А по сему где твое закрытие?

Закрытие чего? Если запроса, то он закрывается непосредственно перед выполненем следующего запроса, т.к. я использую этот TQuery как временный в различных местах программы (чтобы каждый раз не создавать и уничтожать его динамически), так что он довольно часто открывается и закрывается.

Это сообщение отредактировал(а) fess - 2.5.2005, 18:53
--------------------
Компьютер не подчиняется законам физики. Только в нём глюки возникают из ничего, файлы исчезают в никуда, а объём измеряется в метрах и называется весом.
PM MAIL ICQ   Вверх
Guest
Дата 15.5.2005, 09:29 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата
MegaTik:= MegaTik+(GetTickCount - t);
// Накапливаем время выполнения в глобальную переменную, т.к. несколько раз вызывается процедура. Тут время выполнения и увеличивается


Так что же у вас увеличивается на самом деле - MegaTik или (GetTickCount - t) ?

  Вверх
fess
Дата 15.5.2005, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.2.2005
Где: г. Мурманск, Росс ия

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



Цитата(Guest @ 15.5.2005, 09:29)
Так что же у вас увеличивается на самом деле - MegaTik или (GetTickCount - t) ?

MegaTik. Так как процедура выполняется несколько раз, то в переменную MegaTik записывается суммарное время, которое требуется на многократное выполнение этого запроса в процедуре.
--------------------
Компьютер не подчиняется законам физики. Только в нём глюки возникают из ничего, файлы исчезают в никуда, а объём измеряется в метрах и называется весом.
PM MAIL ICQ   Вверх
FireFly
Дата 15.5.2005, 23:24 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ясно.
Тогда слtдующий вопрос:
Цитата
' from %s F, "Sij" S'+    //"Sij" - временная таблица, которая создаётся в другой процедуре


А попробуй выполнять этот запрос некоторое количество раз на одном и том же наборе данных.
Как будет вести себя - MegaTik ?
  Вверх
fess
Дата 16.5.2005, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.2.2005
Где: г. Мурманск, Росс ия

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



Попробывал не изменять таблицу Sij
Практически никаой разницы (т.е. всё равно, что изменяем, что не изменяем Sij) smile
--------------------
Компьютер не подчиняется законам физики. Только в нём глюки возникают из ничего, файлы исчезают в никуда, а объём измеряется в метрах и называется весом.
PM MAIL ICQ   Вверх
FireFly
Дата 17.5.2005, 01:20 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Мда. Неонятно. Хотя я сам никогда не измерял время выполнения своих запросов
от раза к разу. Ну тогда...дурацкий вопрос на вский случай, а какого типа у ваше t и Megatick?
И еще. А если написать и проверить, скажем, такое?

listbox1.visible:=false;
for i:=1 to 1000 do
begin
StomackModule.Query1.Close;
StomackModule.Query1.sql.Clear;
{Добаление запроса в TQuerry}
StomackModule.Query1.sql.Add(Format(Template_S_B_SQL, [BiomTableName, VariantId, YearId, 'and S.Age=F.' + Param]))
t := GetTickCount;//Замечаем время
StomackModule.Query1.Open;
listbox1.items.add(inttostr(GetTickCount - t));
end;
listbox1.visible:=true;

Можно еще попробовать вместо Query1.Open - Query1.Active:=true;
  Вверх
fess
Дата 17.5.2005, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.2.2005
Где: г. Мурманск, Росс ия

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



Цитата
какого типа у ваше t и Megatick?

t:integer;
MegaTik:LongInt;// на всякий случай

Цитата
А если написать и проверить, скажем, такое?

Нормально работает, время выполнения не увеличивается. Значения в listbox'е (3 разные) : 0,15,16 и они повторяются произвольно.
Суммарное время практически постоянно также (изменяется в пределах погрешности: 4750+-50).
Возможно, это связано с тем, что каждый раз один и тотже запрос к одним и тем же таблицам (sij и BiomTableName='cod'), но чем мне это поможет? smile

Цитата
Можно еще попробовать вместо Query1.Open - Query1.Active:=true;

Никакой разницы.
--------------------
Компьютер не подчиняется законам физики. Только в нём глюки возникают из ничего, файлы исчезают в никуда, а объём измеряется в метрах и называется весом.
PM MAIL ICQ   Вверх
fess
Дата 3.8.2005, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.2.2005
Где: г. Мурманск, Росс ия

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



В общем вытащил кусок программы, где происходит увеличение времени, в отдельное приложение.
Вот его код:
Код

procedure TForm1.Button1Click(Sender: TObject);
const
  Template_S_B_SQL=
      'select Sum(last)/AllSumm as NormPj , YearCod,FirstHalf,SecondHalf,DataYear,VariantsId ' +
      ' from "All_Pj.sql" A, "summG.db" S  ' +
      ' where S.YearCod=A.YearCod and '+
      ' S.FirstHalf=A.FirstHalf and ' +
      ' S.SecondHalf=A.SecondHalf and ' +
      ' S.DataYear=A.DataYear ' +
      ' Group by YearCod,FirstHalf,SecondHalf,DataYear,VariantsId';

//  Текст  "All_Pj.sql"
//    select Sum(Weight * MainValue)  as last, YearCod,FirstHalf,SecondHalf,DataYear,VariantsId
//    from  G_Cod F,  Cod S
//    Where
//      F.VariantsId=51   and
//      F.DataYear=S.DataYear  and
//      YearId=17  and
//      F.Age=S.CodYear
//    Group by YearCod,FirstHalf,SecondHalf,DataYear,VariantsId
//
//    UNION
//
//    select Sum(Weight )* MainValue  as last, YearCod,FirstHalf,SecondHalf,DataYear,VariantsId
//    from  G_Capelin F,  Capelin S
//    Where
//      F.VariantsId=51   and
//      F.DataYear=S.DataYear  and
//      YearId=17
//    Group by YearCod,FirstHalf,SecondHalf,DataYear,VariantsId


var
  i,t:Integer;
  Summ:integer;
begin
  Memo1.visible:=false;
  Memo1.Clear;
  Summ:=GetTickCount;
  for i:=1 to 100 do
  begin
    Query1.Close;
    Query1.sql.Clear;
    {Добаление запроса в TQuery}
    Query1.sql.Text:= Template_S_B_SQL;
    t := GetTickCount;//Замечаем время
    Query1.Open;
    {Вывод времени выполнения каждого запроса}
    Memo1.Lines.add(IntToStr(GetTickCount - t));
  end;
  Memo1.visible:=true;
  {Суммарное время выполнения 100 запросов}
  Memo2.Lines.add(IntToStr(GetTickCount-Summ));
end;


Вот здесь лежит сама программа и база данных к ней (альяс настраивается автоматически, прога написанна на Delphi 7, чтобы увидеть этот эффект, надо несколько раз нажать на кнопку), качать браузером: http://ivan_oganin.programist.ru/increase.rar

Может, кто-то сможет помочь, а то я уже запарился smile


--------------------
Компьютер не подчиняется законам физики. Только в нём глюки возникают из ничего, файлы исчезают в никуда, а объём измеряется в метрах и называется весом.
PM MAIL ICQ   Вверх
fess
Дата 17.8.2005, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.2.2005
Где: г. Мурманск, Росс ия

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



Всё, я решил эту проблему! Не прошло и трёх месяцев (или прошло) ! Я крут!!! smile smile smile smile
Надо было всего лишь написать до или после цика Session.Close; и всё!

Это сообщение отредактировал(а) fess - 17.8.2005, 21:06
--------------------
Компьютер не подчиняется законам физики. Только в нём глюки возникают из ничего, файлы исчезают в никуда, а объём измеряется в метрах и называется весом.
PM MAIL ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


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

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


 




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


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

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