Главная страница
    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.51 MB
Время: 0.049 c
15-1199742231
Bloodman
2008-01-08 00:43
2008.02.10
Задачка по ТеорВер у


2-1200910941
Дмитрий_М
2008-01-21 13:22
2008.02.10
Clipboard


15-1199250677
Dmitry S
2008-01-02 08:11
2008.02.10
Не грузится Windows.


2-1200472132
_Shuler_
2008-01-16 11:28
2008.02.10
keyboardlayout


15-1200053321
Darvin
2008-01-11 15:08
2008.02.10
Долгая инсталляция в висте с включенным UAC





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский