Как в Python прочитать файл, который не помещается в оперативную память?

«Как в Python прочитать файл, который не помещается в оперативную память?» — вопрос из категории Python, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Чтобы обработать файл, превышающий объем ОЗУ, необходимо читать его не целиком, а частями (потоково). Это позволяет избежать 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()