![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ускорение процесса добавления текста в TStrings
Virtukon © (2006-01-17 18:40:00)Есть несколько кусков текста в разных TStrings. Необходимо объединить их в одном TStrings. Когда текст имеет размер порядка 1 метра процесс объединения растягивается на довольно длительное время... А у меня есть необходимость оперировать и с 10 метровыми текстами. Что нибудь здесь можно предпринять? Есть советы? Как оптимальнее всего объединить эти тексты?
Джо (2006-01-17 19:30:00) [1]Для упрощения вызовов можно сделать такие две процедуры, потестируй, что быстрее выходит:
procedure AppendStrings (Dest: TStrings; Source: array of TStrings);
var
I: Integer;
begin
for I := Low (Source) to High (Source) do
Dest.AddStrings(Source[I]);
end;
procedure ReplaceStrings (Dest: TStrings; Source: array of TStrings);
var
I: Integer;
Stream: TMemoryStream;
begin
Stream := TMemoryStream.Create;
try
for I := Low (Source) to High (Source) do
Source[I].SaveToStream(Stream);
Stream.Position := 0;
Dest.LoadFromStream(Stream);
finally
Stream.Free;
end
end;
Вызов по схеме:
AppendStrings (StrList3, [StrList1,StrList2]);
Джо (2006-01-17 19:20:00) [2]Используй
StrList3.AddStrings (StrList1);
StrList3.AddStrings (StrList2);
Или такую схему с TMemoryStrem:
procedure TForm1.Button1Click(Sender: TObject);
var
List1,
List2,
List3: TStrings;
Stream: TMemoryStream;
begin
Screen.Cursor := crHourGlass;
try
List1 := TStringList.Create;
try
List2 := TStringList.Create;
try
//List1.LoadFromFile('d:\1.txt'); // 10 Mb
//List2.LoadFromFile('d:\2.txt'); // 10 Mb
List3 := TStringList.Create;
try
Stream := TMemoryStream.Create;
try
// сбрасываем все в стрим
List1.SaveToStream (Stream);
List2.SaveToStream (Stream);
Stream.Position := 0;
// читаем из стрима
List3.LoadFromStream (Stream);
//List3.SaveToFile('d:\3.txt');
finally
Stream.Free;
end;
finally
List3.Free;
end;
finally
List2.Free;
end;
finally
List1.Free;
end;
finally
Screen.Cursor := crDefault;
end
end;
Virtukon (2006-01-17 19:13:00) [3]к примеру:
var
strlist1, strlist2, strlist3: TStrings;
begin
strlist1:=TStringList.Create;
strlist2:=TStringList.Create;
strlist3:=TStringList.Create;
strlist1.loadfromfile('filename1');
strlist2.loadfromfile('filename2');
strlist3.append(strlist1.text);
strlist3.append(strlist2.text);
strlist1.free;
strlist2.free;
strlist3.free;
end;
Джо (2006-01-17 19:01:00) [4]10 Мб текста — это пустяки.
Покажи, как ты с ним работаешь.