Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.06.2012, 20:37
serbius serbius вне форума
Прохожий
 
Регистрация: 23.05.2012
Сообщения: 20
Репутация: 10
Радость Обработка текста больших объемов

Здравствуйте.
Есть текст, предположим, 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  
Старый 02.06.2012, 20:46
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

Код:
Stringlist.sorted := true; // должен ускорить по идее
Ответить с цитированием
  #3  
Старый 02.06.2012, 20:52
serbius serbius вне форума
Прохожий
 
Регистрация: 23.05.2012
Сообщения: 20
Репутация: 10
По умолчанию

Цитата:
Сообщение от Pyro
Код:
Stringlist.sorted := true; // должен ускорить по идее
а он сохраняет ключи, то есть, например, было:
[0]=как
[1]=дела
[2]=вася

Будет ли так после сортировки:
[2]=вася
[1]=дела
[0]=привет
Ответить с цитированием
  #4  
Старый 02.06.2012, 21:04
serbius serbius вне форума
Прохожий
 
Регистрация: 23.05.2012
Сообщения: 20
Репутация: 10
По умолчанию

Цитата:
Сообщение от serbius
а он сохраняет ключи, то есть, например, было:
[0]=как
[1]=дела
[2]=вася

Будет ли так после сортировки:
[2]=вася
[1]=дела
[0]=привет

Ой, это же не php)
тут полюбому надо будет идти по индексу...
что-то уже совсем запутался
Ответить с цитированием
  #5  
Старый 02.06.2012, 21:36
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Добавлять слова в список (StringList) нужно после устанвки свойства Dulpicates в соответствующий режим. Тогда повторяющиеся слова автоматом будут удалены из списка.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #6  
Старый 03.06.2012, 01:01
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

И зачем нужно так изголятся, стараясь запихать такой объем в StringList? Базы данных способны обрабатывать намного большие объемы с приемлимой скоростью выборки. Для 50000 слов я думаю индексный поиск займет доли секунды.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #7  
Старый 03.06.2012, 12:29
serbius serbius вне форума
Прохожий
 
Регистрация: 23.05.2012
Сообщения: 20
Репутация: 10
По умолчанию

разобрался, изменив алгоритм и больше не используя поиска в массиве.

но, возникла другая проблема, в инете нашел функцию разбивки по заданному символу, типа как в 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  
Старый 03.06.2012, 13:04
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

Код:
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  
Старый 03.06.2012, 13:14
serbius serbius вне форума
Прохожий
 
Регистрация: 23.05.2012
Сообщения: 20
Репутация: 10
По умолчанию

Цитата:
Сообщение от Pyro
Код:
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;
спасибо, огромный прирост в скорости, примерно, процентов на 50.

Тему можно закрывать.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:07.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter