Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.052 c
15-1157184459
X9
2006-09-02 12:07
2006.09.24
Распределение Интернет на несколько компьютеров.


15-1157039421
ArtemESC
2006-08-31 19:50
2006.09.24
html-книга...


1-1155579611
lookin
2006-08-14 22:20
2006.09.24
Компонент на основе TCustomPanel: свойство Parent


1-1155146901
Виталий Юрьевич
2006-08-09 22:08
2006.09.24
Помогите оргазизовать обновление БД из интернета.


2-1157688809
Балбес
2006-09-08 08:13
2006.09.24
Клавиатурные сокращения в дизайне





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский