Форум: "Начинающим";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];
ВнизИз-за чего происходит замедление работы? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.036 c