Текущий архив: 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