Главная ошибка новичка - сделать read() и удивляться, почему всё упало. Для больших файлов думай потоками: читаем кусками, обрабатываем по строкам, пишем сразу в новый файл. Так память почти не растёт, а код спокойно переваривает десятки гигабайт.
Что использовать:
Итерацию по строкам - файл читается лениво
Буферизацию - чтобы не делать миллион мелких операций записи
Потоковую запись - результат сразу на диск
gzip на лету - читаем и пишем сжатые файлы без распаковки в RAM
import gzip
src = "big.log.gz"
dst = "filtered.log.gz"
with gzip.open(src, "rt", encoding="utf-8", errors="ignore") as fin,
gzip.open(dst, "wt", encoding="utf-8") as fout:
for line in fin: # ленивое чтение строк
if "ERROR" in line: # любая ваша фильтрация
fout.write(line) # потоковая запись на диск
fout.write("\n") # просто пример финальной записи
fout.write("done\n")