Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.24;
Скачать: CL | DM;

Вниз

Из-за чего происходит замедление работы?   Найти похожие ветки 

 
SergP.   (2006-09-07 16:09) [0]

Имеется такой код:


function MakeExportFile(WW:TWaitWin;AConnect:TAdoConnection;sql,filename:string):boolean;
var
 fieldline:string;
begin
 with TADODataSet.Create(Application)do
 try
   Connection:=AConnect;
   CommandText:=sql;
   Open;
   Result:=RecordCount>0;
   if Result then
     with  TFilestream.create(filename, fmCreate) do
     try
       WW.SetSubMax(RecordCount);
//       Size:=RecordCount*(Fields[0].DataSize+2);
       Position:=0;
       First;
       while not eof do
       begin
         fieldline:=Fields[0].AsString+#13#10;
         WriteBuffer(Pointer(fieldline)^,length(fieldline));
         ww.SetSubProgres(RecNo);
         Next;
       end;
     finally
       free;
     end;
 finally
   free;
 end;
end;


Судя по прогресбару (ww.SetSubProgres(RecNo);) сначала процесс идет быстро, а потом начинает замедляться.
В чем может быть дело? (Создаваемый файл имеет размер несколько мегабайт)
Сначала думал что дело в TFilestream.
Попробовал сразу задать размер: Size:=RecordCount*(Fields[0].DataSize+2);
но разницы не видно...


 
Сергей М. ©   (2006-09-07 16:22) [1]


> В чем может быть дело?


Например, в бестолковом и неоправданном перераспределении памяти


 
han_malign ©   (2006-09-07 16:27) [2]

SetSubProgres?


 
SergP.   (2006-09-07 16:28) [3]

> [1] Сергей М. ©   (07.09.06 16:22)
>
> > В чем может быть дело?
>
>
> Например, в бестолковом и неоправданном перераспределении
> памяти


Ну я тоже так подумал... А как это избежать ?
Как я уже писал - пробовал сначала задать размер данных, но это ничего не дало... Возможно я что-то не так делал? подскажите...


 
SergP.   (2006-09-07 16:31) [4]

> [2] han_malign ©   (07.09.06 16:27)
> SetSubProgres?


Это здесь непричем... Это установка позиции прогресбара. (просто функция выполняется в дополнительном потоке, а в TWaitWin.SetSubProgres значение нужной позиции прогресбара передается в основной поток...


 
Сергей М. ©   (2006-09-07 16:39) [5]


> SergP.   (07.09.06 16:31) [4]


Отладчик-то тебе на что дан ?)


 
Barloggg   (2006-09-07 16:41) [6]

замедление в файловом потоке. стопудово.
создай поток в памяти сделай дело в него а потом единым махом сбрось все содержимое на диск.

например через streamtostream или что там еще есть стандартного.

Я лично пользуюсь подобным приемом в КОЛ (собственно впервые потоками в КОЛ и начал пользоваться) разница в быстродействии обалденная.


 
SergP.   (2006-09-07 16:50) [7]


> [5] Сергей М. ©   (07.09.06 16:39)
>
> > SergP.   (07.09.06 16:31) [4]
>
>
> Отладчик-то тебе на что дан ?)


Хм.  Это долго и нудно... Пришлось бы править код, чтобы перенести в основной поток, ибо я не еще не пытался отлаживать многопоточные приложения... Поэтому и написал сюда, чтобы знающие люди сразу сказали в чем дело...

> создай поток в памяти сделай дело в него а потом единым
> махом сбрось все содержимое на диск.


Щас попробую...


 
Сергей М. ©   (2006-09-07 16:53) [8]


> SergP.   (07.09.06 16:50) [7]


> Это долго и нудно


ну тогда в программинге делать тебе нефига)


> еще не пытался отлаживать многопоточные приложения


Их отладка практически ничем не отличается от отладки однопоточных.
Впрочем на то и форум.
Мог бы и задать соотв.вопрос.


 
default ©   (2006-09-07 17:11) [9]

SergP.   (07.09.06 16:50) [7]
действительно, отладчиком поработай (1)
может из-за частых обращений к диску?
может вызывать WriteBuffer только когда суммарный размер записываемого достигает некоторой величины...
попробуй убрать запись в файл и посмотреть на скорость
вообще опять же (1)


 
SergP.   (2006-09-07 17:11) [10]

Сделал так:

function MakeExportFile(WW:TWaitWin;AConnect:TAdoConnection;sql,filename:string):boolean;
var
 fieldline:string;
 buffer:string;
 posit:integer;
begin
 with TADODataSet.Create(Application)do
 try
   Connection:=AConnect;
   CommandText:=sql;
   Open;
   Result:=RecordCount>0;
   if Result then
     with  TFilestream.create(filename, fmCreate) do
     try
       WW.SetSubMax(RecordCount);
       SetLength(buffer,RecordCount*(Fields[0].DataSize+1));
//      Size:=RecordCount*(Fields[0].DataSize+1);
       Position:=0;
       First;
       posit:=1;
       while not eof do
       begin
         fieldline:=Fields[0].AsString+#13#10;
         Move(fieldline[1],buffer[posit],length(fieldline));
         posit:=posit+length(fieldline);
//        WriteBuffer(Pointer(fieldline)^,length(fieldline));
         ww.SetSubProgres(RecNo);
         Next;
       end;
       WriteBuffer(Pointer(buffer)^,length(buffer));
     finally
       free;
     end;
 finally
   free;
 end;
end;


не помогло... Эффект тот же самый..

Наверное точно придется отлаживать...:-(((


 
SergP.   (2006-09-07 17:16) [11]

> [9] default ©   (07.09.06 17:11)
> SergP.   (07.09.06 16:50) [7]
> попробуй убрать запись в файл и посмотреть на скорость


Блин. Че-то недодумался сначала так сделать..Попробовал....
Вобщем это проблема связаная с TADODataset.
Так что сабжевый вопрос отменяется....


 
Пусик ©   (2006-09-07 17:17) [12]

Проблема, скорее всего, не в записи на диск, а в чтении из БД.
Попробуй вместо чтения из базы просто строки выводить в файл.


 
SergP.   (2006-09-07 17:18) [13]

> [12] Пусик ©   (07.09.06 17:17)
> Проблема, скорее всего, не в записи на диск, а в чтении
> из БД.


Да... Как оказалось именно она... в  [11] SergP.   (07.09.06 17:16) уже написал...



Страницы: 1 вся ветка

Текущий архив: 2006.09.24;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.029 c
2-1157308879
иван8511
2006-09-03 22:41
2006.09.24
Матричный принтер


11-1133308723
Neiroman
2005-11-30 02:58
2006.09.24
Справочник по KOL


2-1157630985
SergP.
2006-09-07 16:09
2006.09.24
Из-за чего происходит замедление работы?


1-1155201044
Mandragor
2006-08-10 13:10
2006.09.24
Работа с MDI приложениям


2-1157531619
webpauk
2006-09-06 12:33
2006.09.24
как определить в каком столбце DBGrid юзер кликнул мышью?