|  | 
 
 | 
| 
 | |||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
|  | 
|  | Опции темы | Поиск в этой теме | Опции просмотра | 
| 
			 
			#1  
			
			
			
			
		 | |||
| 
 | |||
|  Обработка текста больших объемов Здравствуйте. Есть текст, предположим, 50000 тыс слов. Его надо обработать: разбить на слова (по пробелам), создать массив, который бы не содержал дубликатов слов и второй массив, считающий кол-во повторений того или иного слова, который бы был связан по ключу с первым. Так вот, задача вроде бы реализована, но, поскольку поиск слов в TStringList реализован через indexOf, то поиск может быть очень медленным, порой до нескольких минут. Вопрос: как можно оптимизировать поиск, возможно, еще что-то? Дополнение №1: Могу выложить исходик, если будет надо. Дополнение №2: В инете откопал такой вот пример, может, действительно, быстрее будет проверять: вставилась ли строка? Код: var Strlist: TStringList;
begin
  Strlist := TStringList.Create;
  Strlist.Duplicates := dupError;
  Strlist.Add('aa'); {добавляем первую строку}
  try
    Strlist.Add('aa'); {добавляем дубликат}
    ShowMessage('Ok');
  except
    on EStringListError do ShowMessage('Duplicate');
  end;
end; Спасибо! Последний раз редактировалось serbius, 02.06.2012 в 21:00. | 
| 
			 
			#2  
			
			
			
			
		 | |||
| 
 | |||
|   Код: Stringlist.sorted := true; // должен ускорить по идее | 
| 
			 
			#3  
			
			
			
			
		 | |||
| 
 | |||
|   Цитата: 
 [0]=как [1]=дела [2]=вася Будет ли так после сортировки: [2]=вася [1]=дела [0]=привет | 
| 
			 
			#4  
			
			
			
			
		 | |||
| 
 | |||
|   Цитата: 
 Ой, это же не php) тут полюбому надо будет идти по индексу... что-то уже совсем запутался | 
| 
			 
			#5  
			
			
			
			
		 | ||||
| 
 | ||||
|   Добавлять слова в список (StringList) нужно после устанвки свойства Dulpicates в соответствующий режим. Тогда повторяющиеся слова автоматом будут удалены из списка. | 
| 
			 
			#6  
			
			
			
			
		 | ||||
| 
 | ||||
|   И зачем нужно так изголятся, стараясь запихать такой объем в StringList? Базы данных способны обрабатывать намного большие объемы с приемлимой скоростью выборки. Для 50000 слов я думаю индексный поиск займет доли секунды. | 
| 
			 
			#7  
			
			
			
			
		 | |||
| 
 | |||
|   разобрался, изменив алгоритм и больше не используя поиска в массиве. но, возникла другая проблема, в инете нашел функцию разбивки по заданному символу, типа как в php explode, так вот, 10 тыс слов она обрабатывает за 8-10 сек, а 50+ тыс - вообще отказывается: через минуту говорит, что нет памяти. Помогите как-то ее оптимизировать, или посоветуйте другое решение Код: function TForm1.Explode(separator: String; text: String): TStringList;
var
  ts: TStringList;
  i_pos: Integer;
  text_new: String;
  s_item: String;
begin
  ts := TStringList.Create;
  text_new := text;
  while (text_new <> '') do begin
    i_pos := Pos(separator, text_new);
    if i_pos = 0 then begin
      s_item := text_new;
      text_new := '';
    end
    else begin
      s_item := Copy(text_new, 1, i_pos - 1);
      text_new := Copy(text_new, i_pos + Length(separator), Length(text_new) - i_pos);
    end;
    ts.Add(s_item);
  end;
  Result := ts;
end;Последний раз редактировалось serbius, 03.06.2012 в 12:53. | 
| 
			 
			#8  
			
			
			
			
		 | |||
| 
 | |||
|   Код: function Explode(text: String; separator: String=' '): TStringList; begin text := StringReplace(text, #13#10, ' ', [rfReplaceAll]); text := StringReplace(text, separator, #13#10, [rfReplaceAll]); result := TStringList.Create; result.Text := text; end; | 
| Этот пользователь сказал Спасибо Pyro за это полезное сообщение: | ||
|  
serbius (03.06.2012)
 | ||
| 
			 
			#9  
			
			
			
			
		 | |||
| 
 | |||
|   Цитата: 
 Тему можно закрывать. |