Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.10;
Скачать: CL | DM;

Вниз

как увеличить скорость при работе с TMemoryStream   Найти похожие ветки 

 
Danil   (2008-01-15 16:55) [0]

Доброго время суток!!!
есть программа которая сохраняет данные из база данных в файл и из файла загружает их обратно. Пользуюсь 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) [1]

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

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


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

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


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

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


 
MetalFan ©   (2008-01-15 17:29) [4]


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


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

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


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


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

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


 
Dennis I. Komarov ©   (2008-01-15 17:33) [6]

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


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


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

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


 
homm ©   (2008-01-15 18:15) [8]

> [7] Danil   (15.01.08 17:57)

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


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


> TMemoryStream


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


> Zagruzka.Clear; //это memo


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

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

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

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


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

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


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

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

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

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


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

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


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


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


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

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

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


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


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

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


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


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



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


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


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


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

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


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


> Danil   (16.01.08 10:12) [16]

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


 
Slym ©   (2008-01-17 09:56) [18]

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


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

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


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

Я рыдал...


 
Slym ©   (2008-01-17 10:59) [21]

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



Страницы: 1 вся ветка

Текущий архив: 2008.02.10;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.023 c
15-1199641953
DVM
2008-01-06 20:52
2008.02.10
Потестите модуль для расчета CRC8/16/32/64


2-1200661708
Alex_C
2008-01-18 16:08
2008.02.10
TColorDialog - убрать лишние цвета


1-1194007320
try
2007-11-02 15:42
2008.02.10
Lotus Domino


15-1199628190
kotenok
2008-01-06 17:03
2008.02.10
Перенос базы данных на новый компьютер


2-1200290731
Dana
2008-01-14 09:05
2008.02.10
111