![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как увеличить скорость при работе с TMemoryStream [D5, XP]
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 ?