Показать сообщение отдельно
  #1  
Старый 27.09.2013, 12:44
kasper_chib kasper_chib вне форума
Прохожий
 
Регистрация: 26.09.2013
Сообщения: 5
Версия Delphi: Delphi 7
Репутация: 10
Сообщение Привет всем! Оптимизировать!

Привет всем! Кто может подскажите! Проблема следующая:
Есть два файла dbf каждый примерно около 100 000 записей.
Записи перегоняю в StringList, для каждого dbf свой StringList.
Дальше сравниваю StringList-ы и по неким условиям пишу результат в другие StringList-ы. Работает очень медленно, примерно 2 500 записей обрабатываются 10 минут. Тормозит на этом цикле:
Код:
  // функция из dbf пишет в StringList
  StrListSprEgkNew := WriteDbfInStringList(dirFileSprNew);
  dirFileSprOld := FindDirForFileSpr(False);
  StrListSprEgkOld := TStringList.Create;
  // функция из dbf пишет в StringList 
  StrListSprEgkOld := WriteDbfInStringList(dirFileSprOld);
  StrListSprEgkRez := TStringList.Create;
  StrListSprEgkRezInvalid := TStringList.Create;
  for iStrListSprEgkNew := 0 to StrListSprEgkNew.Count - 1 do
  begin
    markRez := 1; // метка писать в результирующий1 StringList 
    markRezInvalid := 0;// метка писать в результирующий2 StringList 
    codeEgkNew := strWord(StrListSprEgkNew[iStrListSprEgkNew],2,#9);
// функция StrWord(s,n,a) из строки s вырезает позицию n разделителя a
    invalidNew :=    StrToInt(strWord(StrListSprEgkNew[iStrListSprEgkNew],4,#9));
    for iStrListSprEgkOld := 0 to StrListSprEgkOld.Count - 1 do
    begin
      invalidOld := StrToInt(strWord(StrListSprEgkOld[iStrListSprEgkOld],4,#9));
      codeEgkOld := strWord(StrListSprEgkOld[iStrListSprEgkOld],2,#9);
      if codeEgkNew = codeEgkOld then
      begin
        markRez := 0;
        if (invalidOld = 1) and (invalidNew = 0) then
        begin
          markRez := 1;
        end;
        if (invalidOld = 0) and (invalidNew = 1) then
        begin
          markRezInvalid := 1;
        end;
      end;
    end;
    if (markRez = 1) and (invalidNew = 0) then
    begin
      StrListSprEgkRez.Add(StrListSprEgkNew[iStrListSprEgkNew]);
    end;
    if markRezInvalid = 1 then
    begin
      StrListSprEgkRezInvalid.Add(StrListSprEgkNew[iStrListSprEgkNew]);
    end;
    Logger.Add(IntToStr(iStrListSprEgkNew));
  end;
Админ: Пользуемся тегами для оформления кода!

подскажите как можно оптимизировать процесс?
Ответить с цитированием