#delphi
В данном коде при обработке файла в 200 мегабайт выскакивает ошибка: out of memory. Как исправить Данную ошибку в этом коде ? var list:TStrings; i:integer; str:string; begin list :=TStringList.Create; list.LoadFromFile(OpenDialog1.FileName); for i :=list.count-1 downto 0 do begin str :=list.Strings[i]; while Pos(edit1.text, str) >0 do begin Delete(str, Pos(edit1.text, str), Length(edit1.text)) ; list.Strings[i] :=str; end; end; list.SaveToFile('out.txt'); list.free; end;
Ответы
Ответ 1
var txtIn, txtOut: TextFile; str: string; begin AssignFile(txtIn, OpenDialog1.FileName); AssignFile(txtOut, ExtractFilePath(OpenDialog1.FileName) + 'tmp.txt'); Reset(txtIn); Rewrite(txtOut); while not EOF(txtIn) do begin ReadLn(txtIn, str); // ... WriteLn(txtOut, str); end; CloseFile(txtOut); CloseFile(txtIn); // move 'tmp.txt' to OpenDialog1.FileName end;Ответ 2
Можно работать через TStreamReader и TStreamWriter. При некоторых условиях скорость работы может быть больше до 3х раз, чем по-старинке с readln и writeln: var s:string; reader:TStreamReader; writer:TStreamWriter; begin reader:=TStreamReader.Create(OpenDialog1.FileName, TEncoding.ANSI); // Если нужна другая кодировка - сменить writer := TStreamWriter.Create('out.txt', false,TEncoding.ANSI); // если нужно дописать файл, ставим True вместо false while not reader.EndOfStream do begin s:=reader.ReadLine; // делаем, что нужно с s writer.WriteLine(s); end; // не забываем закрыть оба файла: reader.Free; writer.Free; end; Если же нужно обязательно хранить все строки в памяти, стоит работать через, например, TMemoryStream или TBytesStream, но стоит помнить, что в 32-битном режиме их емкость ограничена чуть менее, чем 2 Гб, а в 64-битном режиме, если надо > 2 Гб, с ними можно нормально работать только, начиная с Delphi Tokyo, или же делать патч.
Комментариев нет:
Отправить комментарий