#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, или же делать патч.
Комментариев нет:
Отправить комментарий