Страницы

Поиск по вопросам

понедельник, 23 декабря 2019 г.

Чтение построчно out of memory

#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, или же делать патч.

Комментариев нет:

Отправить комментарий