Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.138.125.2] |
|
Сообщ.
#1
,
|
|
|
В данном коде при обработке файла в 100 мегабайт выскакивает ошибка: 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; |
Сообщ.
#2
,
|
|
|
Просто прочитать не весь список в память, а читать по одной строке: прочитали её, проанализировали, записали её.
|
Сообщ.
#3
,
|
|
|
100 метров для TStringList - семечки .
Для начала - считать файл в TStringList и обрабатывать его с ПЕРВОЙ строчки, а не с ПОСЛЕДНЕЙ. Судя по коду из каждой строки надо удалить подстроку (возможно не один раз), введённую юзером в Edit1. Что-то типа len, find : integer; // давно не писал на паскале, суть, я думаю, понятна len := Length(edit1.text); // один раз перед циклом по строкам! while true do begin // бесконечный цикл find := Pos(edit1.text, str); if pos = 0 then break; // выйти из цикла while Delete(str, find, len); list.Strings[i] :=str; end; |