Вот переделай под себя.
Код:
Memo1.lines.BeginUpdate;//Запретить перерисовку
for i := Memo1.lines.Count - 1 downto 0 do
begin
//Тут смело удаляй ненужные строки, тк цикл идет с конца - ничего смещать не прийдется.
end;
Memo1.lines.EndUpdate;//вернуть в нормальное состояние
Если есть возможность дай лог-файл поэкспериментировать, а вообще для для строк придется поработать с PChar - не копировать строку а смещать указатель.
pos(']', xxx) - храни длину каждой строки в поле Object (заполни один раз перед основным циклом).