Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ускорение процесса добавления текста в 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 Мб текста — это пустяки.
Покажи, как ты с ним работаешь.


Наверх

Титульная страница Поиск, карта сайта Написать письмо