Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2011, 16:09   #1
jskorvin
Пользователь
 
Регистрация: 27.09.2010
Сообщений: 16
Вопрос Как быстро отсортировать строки

Доброго времени суток!
Есть 2 файла:
1) 2 500 000 строк
2) 100 000 строк

Нужно максимально быстро проверить наличие строки из первого файла во втором файле.
TStringList отбрасывается сразу т.к. первый файл в него просто не загрузится.
TextFile был отброшен из-за скорости, обработка длилась очень долго.

Последняя реализация была на TStringStream
Код:
inputTmp:=TStringStream.Create;
inputTmp.Position:=0;
запись
Код:
inputTmp.WriteString(Строка+#13#10);
Цикл проверки наличия строки во втором файле, если строки нет, то она записывается в другой СтрингСтрим
Код:

while inputTmp.Position < inputTmp.Size do
  begin

  url:=''; 
  while Pos(#13#10, url) = 0 do
      url:=url+inputTmp.ReadString(1);

   url:=Copy(url, 0, Pos(#13, url)-1);


if pos(url, inputFull.DataString) = 0 then
   begin
     out.WriteString(url+#13#10);
   end;

   end;
Подскажите пожалуйста как правильно выполнить поставленную задачу? Как сделать сортировку быстрее? В данный момент сортируется около часа =(

Последний раз редактировалось jskorvin; 20.11.2011 в 01:42. Причина: считать разучился, 2 и 3 попутал
jskorvin вне форума Ответить с цитированием
Старый 20.11.2011, 19:58   #2
jskorvin
Пользователь
 
Регистрация: 27.09.2010
Сообщений: 16
По умолчанию

udp: сорри, что не в тот раздел запостил, думал "общие вопросы дельфи" наиболее подходящий.
Я давно уже не студент и пишу для себя, слова "как правильно выполнить" подразумевают как это нужно делать, а не как написано в учебниках.
Под рукой программа которая выполняет похожую задачу (отсев дубликатов строк) за 3-4 минуты, моё же творение в легкую тратит на ту же задачу час с лишним =(
С количеством строк до 100 000 я справляюсь легко, а вот на 2 500 000 строках проявляется моя безграмотность в вопросе..
jskorvin вне форума Ответить с цитированием
Старый 21.11.2011, 00:29   #3
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Честно говоря, не понятно в чём вобще вопрос, т.к. 3-4 минуты на лукап 2.5М строк — это тоже много, не говоря уже о часах.

Вот я случайно вместо 2.500.000 входных строк сформировал файл на 25.000.000 строк (700MB), и, соответсвенно, файл на 1.000.000 строк для поиска (30 MB).

Первый файл грузить куда-либо, естественно, не нужно, всё, что от него нужно — это просто читать строки одну за другой.

Второй файл (повторюсь, на 1М строк), легко грузится в TSringList и сортируется секунд за 15.

Далее обычный цикл с подсчётом, можно добавить запись новых строк в третий файл, это не принципиально. Вся программа отрабатывает минуты за 2.

Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils, Classes;

var
  ls: TStringList;
  f: Text;
  s: string;
  //
  cempty, csame, cnew: int64;
begin
  Assign(f, 'input.txt');
  Reset(f);
  //
  ls := TStringList.Create();
  ls.LoadFromFile('lookup.txt');
  ls.Sorted := true;
  //
  cempty := 0;
  csame  := 0;
  cnew   := 0;
  try
    while (not EOF(f)) do begin
      //
      readLn(f, s);
      if ('' <> s) then begin
        //
        if (0 <= ls.IndexOf(s)) then
          inc(csame)
        else
          inc(cnew);
      end
      else
        inc(cempty);
    end;
  finally
    ls.Free();
    Close(f);
  end;
  //
  writeLn('New: ', cnew, '; same: ', csame, '; empty: ', cempty);
end.
Может, у вас строки какие-то особые? )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отсортировать строки массива(Pascal) Cas01 Помощь студентам 0 15.05.2011 16:44
Как быстро сложить связанные строки с формулой Tidus Microsoft Office Excel 8 31.05.2010 10:16
Как быстро перемешать строки? zver777 Общие вопросы Delphi 5 23.08.2009 20:50
как отсортировать массив под данный отрезок и как минимум и максимум из него найти SIEGER Паскаль, Turbo Pascal, PascalABC.NET 1 20.11.2008 08:58
Как отсортировать Uhryap Microsoft Office Word 2 24.02.2007 16:58