Ответ
Чтобы обработать файл, превышающий объем ОЗУ, необходимо читать его не целиком, а частями (потоково). Это позволяет избежать MemoryError, загружая в память только небольшой фрагмент данных за раз.
Основных подходов два:
1. Построчное чтение (для текстовых файлов)
Это самый идиоматичный и эффективный способ для текстовых данных. Файловый объект в Python является итератором, что позволяет читать его строку за строкой в цикле for.
# В память загружается только одна строка за итерацию
with open('large_log_file.txt', 'r', encoding='utf-8') as f:
for line in f:
# Обрабатываем каждую строку индивидуально
process_line(line)
2. Чтение блоками фиксированного размера (для бинарных файлов)
Этот метод подходит для бинарных файлов (изображения, видео) или когда нужна обработка данных блоками определенного размера.
chunk_size = 8192 # 8 KB
with open('large_video_file.mkv', 'rb') as f:
# Цикл продолжается, пока f.read() возвращает непустые байты
while chunk := f.read(chunk_size):
process_chunk(chunk)
Чего следует избегать
Никогда не используйте следующие методы для больших файлов, так как они пытаются загрузить весь файл в память:
file.read()file.readlines()