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;


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


Slym   (2008-01-17 10:59:00) [1]

Плохиш ©   (17.01.08 10:46) [20]
мне пофиг что такие "спецы" за свою работу еще и деньги получает, меня пугает что такие "спецы" на производстве работают и его "автоматизируют"...


Плохиш   (2008-01-17 10:46:00) [2]

Я рыдал...


Danil   (2008-01-17 10:26:00) [3]

короче тут другая фишка: надо обращаться к базе данных с помощью запросов... а все процедуры в делфи убирать... короче я и сам разобрался.
спасибо за попытки помощи... :)


Slym   (2008-01-17 09:56:00) [4]

Danil   (16.01.08 10:12) [16]
убери запись (закоментируй) и проверь скорость... если кардинально не озменилась значит не в записи дело


Плохиш   (2008-01-16 12:35:00) [5]


> Danil   (16.01.08 10:12) [16]

Нда, остаётся только "максимум" из [9]. Это даже не смешно...


Danil   (2008-01-16 10:12:00) [6]


> memo выкинуть, для этого существует TStringList

TStringList'ом и TStringStream'ом пробывал записывало еще медленее 10-20кб/сек.


Сергей М.   (2008-01-15 23:28:00) [7]


> Плохиш ©   (15.01.08 23:03) [14]



> в меню есть и коньячёк и беленькая


При оказии буду, тэкскэть, иметь ввиду)


Плохиш   (2008-01-15 23:03:00) [8]


> Сергей М. ©   (15.01.08 22:44) [13]

Хм, отказался :-)) Вот, что значит правильно на затравку предложить :-)) а в меню есть и коньячёк и беленькая (Старую Москву два дня назад подарили, вот все знают что водки не пью, а дарят, издеваются наверное) :-P


Сергей М.   (2008-01-15 22:44:00) [9]


> Плохиш ©   (15.01.08 22:40) [12]


Не набивался)

Но ежели что - виски не люблю)

Уж лучше хорошей беленькой.. или коньячку приличного)


Плохиш   (2008-01-15 22:40:00) [10]

Надеюсь, Сергей М.тоже в собутыльники набивался :-)) могли бы и на троих сообразить :-) Виски есть :-P


Stexen   (2008-01-15 19:47:00) [11]

Ох как...
Жестко...
Я помолчу...

> Плохиш ©   (15.01.08 18:36) [9]

Собутыльник не нужен?


Сергей М.   (2008-01-15 19:40:00) [12]

Удалено модератором


Плохиш   (2008-01-15 18:36:00) [13]


> TMemoryStream


> 4,5Гб закачавает


> Zagruzka.Clear; //это memo


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

Пойду напьюсь...

минимум TMemoryStream выкинуть, писать в TfileStream
memo выкинуть, для этого существует TStringList

максимум - заменить пркладку...


homm   (2008-01-15 18:15:00) [14]

> [7] Danil   (15.01.08 17:57)

Я что то не понял, у тебя используется какая-то СУБД, или все на своем коде?


Danil   (2008-01-15 17:57:00) [15]


> Для таких объемов следует использовать полноценную СУБД

т.е. ? не частично ее выгружать, а полностью??


Dennis I. Komarov   (2008-01-15 17:33:00) [16]

Для таких объемов следует использовать полноценную СУБД


Danil   (2008-01-15 17:32:00) [17]


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

??? а что тут не так?? чем код плохой?


MetalFan   (2008-01-15 17:29:00) [18]


> может стоит что то изменить


> делфи плохова то знаю :(
>

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


Danil   (2008-01-15 17:19:00) [19]

может стоит что то изменить, подкорректировать...


Danil   (2008-01-15 17:09:00) [20]

ну я не знаю в чем именно дело... но надо как то скорость загрузки увеличить... делфи плохова то знаю :(


Страницы:   1 2

Наверх

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