Утечка памяти / out of memory (Delphi XE4)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Alina2015, 29 Jan 2018.

  1. Alina2015

    Alina2015 New Member

    Joined:
    29 Jan 2018
    Messages:
    11
    Likes Received:
    2
    Reputations:
    0
    Добрый день, Уважаемые пользователи. Суть проблемы: При запуске процедуры идет замена слов в файле размеров в 400 мегабайт. И после 5-10 секунд выскакивает окно out of memory. Хотя файлы до 200 мегабайт обрабатывает.

    Я так поняла что это из за недостатка выделенной памяти на массив, строку. Какие ошибки допущены в коде и как решить эту проблему? Может по другому что в коде оформить ? Буду благодарна за помощь.

    Версия Delphi: Embarcadero® Delphi® XE4
    Code:
    procedure Tfrm_Main.Run;
    var afList: TStringDynArray;
        i, j, k: integer;
        L, rL, fL: TStringList;
        NewName, tmp: String;
    
    begin
     memo_Log.Lines.Add(Format('Начало обработки: %s', [DateTimeToStr(Now)]));
     memo_Log.Lines.Add('///');
     memo_Log.Lines.Add('');
     L := TStringList.Create;
     for i := 0 to memo_Folders.Lines.Count - 1 do
     
    begin
       afList := TDirectory.GetFiles(memo_Folders.Lines[i], '*.txt', SO);
       for j := 0 to Length(afList) - 1 do
        L.Add(afList[j]);
      end;
     rL := TStringList.Create;
     rL.Text := Trim(memo_List.Text);
     k := 0;
     fL := TStringList.Create;
     for i := 0 to L.Count - 1 do
     
    begin
       memo_Log.Lines.Add(Format('Обработка файлов %s', [L.Strings[i]]));
       fL.LoadFromFile(L.Strings[i]);
       tmp := ExtractFileName(L.Strings[i]);
       tmp := Copy(tmp, 1, Pos('.', tmp) - 1);
       NewName := Format('%s%s.%s', [ExtractFilePath(L.Strings[i]),
                                         tmp,
                                         FormatDateTime('ddmmyy_hhnn', Now)]);
      
    if rg_Order.ItemIndex = 1 then
        for j := 0 to rL.Count - 1 do
         rL.Exchange(j, RandomRange(0, rL.Count));
       for j := 0 to fL.Count - 1 do
        begin
         fL.Strings[j] := StringReplace(fL.Strings[j], edt_Word.Text, rL.Strings[k], RF);
         inc(k);
         if k = rL.Count then k := 0;
        end;
       fL.SaveToFile(NewName);
       memo_Log.Lines.Add(Format('Сохранение под именем %s', [NewName]));
       memo_Log.Lines.Add('');
      end;
     memo_Log.Lines.Add('///');
     memo_Log.Lines.Add(Format('Окончание обработки: %s', [DateTimeToStr(Now)]));
     fL.Free;
     rL.Free;
     L.Free;
     btn_Next.Enabled := false;
     LoadBMP(btn_Prev, 5);
     btn_Prev.Caption := 'С начала';
    end;
     
  2. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    634
    Likes Received:
    246
    Reputations:
    42
    Вероятно проблема в TStringList. Чтобы избежать подобных вещей используйте WinApi
    VirtualAlloc -> CreateFile -> ReadFile -> Изменения -> WriteFile
     
    Alina2015 likes this.
  3. Alina2015

    Alina2015 New Member

    Joined:
    29 Jan 2018
    Messages:
    11
    Likes Received:
    2
    Reputations:
    0
    Немного подсказать не сможете как это сделать выходя их кода что выше ?
     
  4. Alina2015

    Alina2015 New Member

    Joined:
    29 Jan 2018
    Messages:
    11
    Likes Received:
    2
    Reputations:
    0
    Все проблему решила. Всем спасибо за внимание. Использовала функцию ExtractFileExt.