![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Из-за чего происходит замедление работы?
SergP. © (2006-09-07 16:09:00)Имеется такой код:
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);
но разницы не видно...
SergP. (2006-09-07 17:18:00) [1]> [12] Пусик © (07.09.06 17:17)
> Проблема, скорее всего, не в записи на диск, а в чтении
> из БД.
Да... Как оказалось именно она... в [11] SergP. (07.09.06 17:16) уже написал...
Пусик (2006-09-07 17:17:00) [2]Проблема, скорее всего, не в записи на диск, а в чтении из БД.
Попробуй вместо чтения из базы просто строки выводить в файл.
SergP. (2006-09-07 17:16:00) [3]> [9] default © (07.09.06 17:11)
> SergP. (07.09.06 16:50) [7]
> попробуй убрать запись в файл и посмотреть на скорость
Блин. Че-то недодумался сначала так сделать..Попробовал....
Вобщем это проблема связаная с TADODataset.
Так что сабжевый вопрос отменяется....
default (2006-09-07 17:11:00) [4]SergP. (07.09.06 16:50) [7]
действительно, отладчиком поработай (1)
может из-за частых обращений к диску?
может вызывать WriteBuffer только когда суммарный размер записываемого достигает некоторой величины...
попробуй убрать запись в файл и посмотреть на скорость
вообще опять же (1)
SergP. (2006-09-07 17:11:00) [5]Сделал так:
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;
не помогло... Эффект тот же самый..
Наверное точно придется отлаживать...:-(((
Сергей М. (2006-09-07 16:53:00) [6]
> SergP. (07.09.06 16:50) [7]
> Это долго и нудно
ну тогда в программинге делать тебе нефига)
> еще не пытался отлаживать многопоточные приложения
Их отладка практически ничем не отличается от отладки однопоточных.
Впрочем на то и форум.
Мог бы и задать соотв.вопрос.
SergP. (2006-09-07 16:50:00) [7]
> [5] Сергей М. © (07.09.06 16:39)
>
> > SergP. (07.09.06 16:31) [4]
>
>
> Отладчик-то тебе на что дан ?)
Хм. Это долго и нудно... Пришлось бы править код, чтобы перенести в основной поток, ибо я не еще не пытался отлаживать многопоточные приложения... Поэтому и написал сюда, чтобы знающие люди сразу сказали в чем дело...
> создай поток в памяти сделай дело в него а потом единым
> махом сбрось все содержимое на диск.
Щас попробую...
Barloggg (2006-09-07 16:41:00) [8]замедление в файловом потоке. стопудово.
создай поток в памяти сделай дело в него а потом единым махом сбрось все содержимое на диск.
например через streamtostream или что там еще есть стандартного.
Я лично пользуюсь подобным приемом в КОЛ (собственно впервые потоками в КОЛ и начал пользоваться) разница в быстродействии обалденная.
Сергей М. (2006-09-07 16:39:00) [9]
> SergP. (07.09.06 16:31) [4]
Отладчик-то тебе на что дан ?)
SergP. (2006-09-07 16:31:00) [10]> [2] han_malign © (07.09.06 16:27)
> SetSubProgres?
Это здесь непричем... Это установка позиции прогресбара. (просто функция выполняется в дополнительном потоке, а в TWaitWin.SetSubProgres значение нужной позиции прогресбара передается в основной поток...
SergP. (2006-09-07 16:28:00) [11]> [1] Сергей М. © (07.09.06 16:22)
>
> > В чем может быть дело?
>
>
> Например, в бестолковом и неоправданном перераспределении
> памяти
Ну я тоже так подумал... А как это избежать ?
Как я уже писал - пробовал сначала задать размер данных, но это ничего не дало... Возможно я что-то не так делал? подскажите...
han_malign (2006-09-07 16:27:00) [12]SetSubProgres?
Сергей М. (2006-09-07 16:22:00) [13]
> В чем может быть дело?
Например, в бестолковом и неоправданном перераспределении памяти