Добрый день, Уважаемые пользователи. Суть проблемы: При запуске процедуры идет замена слов в файле размеров в 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;
Вероятно проблема в TStringList. Чтобы избежать подобных вещей используйте WinApi VirtualAlloc -> CreateFile -> ReadFile -> Изменения -> WriteFile