Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как увеличить скорость при работе с TMemoryStream [D5, XP]


Страницы:   1 2

Danil ©   (2008-01-15 16:55:00) 

Доброго время суток!!!
есть программа которая сохраняет данные из база данных в файл и из файла загружает их обратно. Пользуюсь TMemoryStream и TFileStream, так как данные нужно сохранять в файл частями иначе вся база данных будет подвисать (в этой базе данных работает много людей).
программа работает, но работает медленно. 4,5Гб закачавает за 8 часов, т.е. за 1сек./156Кбайт. нужно чтобы загрузалось и выгружалось все ну может где за час...

вот код загрузки в файл:

procedure TForm1.LoadDataClick(Sender: TObject);
var
F: TFileStream;
ms: TMemoryStream;
str : string;
im, la, ig :integer;
eoz : boolean;
ScrCurs : TCursor;
Buf : string;
TF:TextFile;
st_filtname:string;

procedure StreamToFile;
begin
 ms.Position := 0;
 F.CopyFrom(ms, ms.Size);
 ms.Clear;
end;

procedure WriteSubStr(Str: String);  //var  Str: Widestring; //
var
 ls : word; //integer; // word;
begin
 if ms.Size > 262100 then StreamToFile;
    ls := Length(Str);
    ms.Write(ls,SizeOf(ls));
    ms.WriteBuffer(PChar(Str)^, Length(Str));
end;

procedure WriteZAP(Glb, SodGlb: String);  
 begin
  WriteSubStr(Glb);
  WriteSubStr(SodGlb);
 end;

begin
 if SaveDialog.Execute then
   begin
     ScrCurs := Screen.Cursor;
     Screen.Cursor := crHourGlass;
     ms:= TMemoryStream.Create;
     F:= TFileStream.Create(SaveDialog.FileName,fmCreate);
     Zagruzka.Clear; //это memo
     Zagruzka.Visible:=True;
     VisM1.NameSpace := EdObl.Text; //связь с областью базой данных
     VisM1.P3 := '';//текущая переменная
     for ig := 0 to glbList.Items.Count-1 do
       begin
         str := glbList.Items[ig];
         if AllGlob.Checked or glbList.Checked[ig] then
           begin
             im := Zagruzka.Lines.Add(str+'... ');
             VisM1.P3 := str;  //название переменной
             VisM1.Execute('S P1=$D(@P3)#2 I P1 S P2=@P3'); //проверяем существование значения в корне переменной            
             if VisM1.P1 = '1' then
                WriteZAP(str, VisM1.P2); //çàïèñàëè çíà÷åíèå
             while True do
               begin
                 VisM1.Execute('S P3=$Q(@P3),P1=0,P2="" I P3''="" S a=@P3,P2=$e(a,1,16384) I $L(a)>16384 S P1=1');
                 str := VisM1.P2;
                 if VisM1.P1 = 1 then
                   begin
                     VisM1.Execute('S a=@P3,P2=$e(a,16385,32768)');
                     str := str + VisM1.P2;
                   end;
                 if VisM1.P3 '' then
                    begin
                      WriteZAP(VisM1.P3, str);
                    end
                 else break;
               end;
             Zagruzka.Lines[im] :=  Zagruzka.Lines[im] + ' завершено';
           end;
       end;
     if ms.Size > 0 then StreamToFile;
     Zagruzka.Lines.Add('Готово...');
     F.Free;
     ms.Free;
     Screen.Cursor := ScrCurs;
   end;
 EdObl.SetFocus;
end;



а вот код выгрузки из файла:

procedure TForm1.UpLoadDataClick(Sender: TObject);
var
F : TFileStream;
ms : TMemoryStream;
ScrCurs : TCursor;
glob : string;
la : integer;
str : WideString;
im : integer;

function ReadStr: String;
var
 L:  word;
begin
 F.ReadBuffer(L, 2);
 SetLength(Result, L);
 if L > 0 then F.ReadBuffer(Pointer(Result)^, L)
 else Result := '';
end;

begin
 im := glbList.ItemIndex;
 if OpenDialog.Execute then begin
   glob := '^....';
   la := 5;
   ScrCurs := Screen.Cursor;
   Screen.Cursor := crHourGlass;
   Zagruzka.Clear;
   Zagruzka.Visible := True;
   ms := TMemoryStream.Create;
   F:= TFileStream.Create(OpenDialog.FileName, fmOpenRead);
   VisM1.NameSpace := EdObl.Text;
   F.Position:=0;
   try
     while F.Position < F.Size do
       begin
         VisM1.P1 := ReadStr;
         if copy(VisM1.P1,1,la) glob then
          begin
           glob := VisM1.P1;
           la := pos('(',glob);
           if la >0 then glob := copy(glob ,1, la - 1);
           la := Length(glob);
           Zagruzka.Lines.Add(glob + '... ');
         end;
         str := ReadStr;
         VisM1.P2 := copy(str, 1, 16384);
         VisM1.Execute('S @P1=P2');
         if Length(str) > 16384 then begin
           VisM1.P2 := copy(str, 16385, 16384);
           VisM1.Execute('S @P1=@P1_P2');
         end;
     end;
   finally
     Zagruzka.Lines.Add('Готово...');
   end;
   ms.Free;
   F.Free;
   Screen.Cursor := ScrCurs;
 end;
end;


пожалуйста помогите разобраться!!! за ранее спасибо!!!!


homm   (2008-01-15 17:02:00) [21]

> [0] Danil   (15.01.08 16:55)
> как увеличить скорость при работе с TMemoryStream

и при всем при том, что в описании, ты считаешь, что тормозит всетаки TMemoryStream ?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо