Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Увеличение времени выполнения, Почему? 
:(
    Опции темы
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;
  Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0666 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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