← Все вопросы

Как прочитать огромный файл (несколько гигабайт), не загружая его в память целиком?

Задан 11 месяцев назад799 просмотров2 ответа
15

Файл на пару гигов, делаю f.read() или f.readlines() — программа съедает всю память и падает. Нужно обработать построчно, но без загрузки всего файла сразу. Как правильно?

2 ответа

27
✓ Принятый ответ — помог автору

Сам файловый объект — ленивый итератор: если просто крутить for line in f:, Python подгружает строки по одной, а не весь файл в память:

with open('huge.log', encoding='utf-8') as f:
    for line in f:
        process(line)

Главное — НЕ вызывать f.read() и f.readlines(): они тянут всё содержимое разом, отсюда и переполнение. Цикл по f ест ровно одну строку за раз, поэтому файл любого размера обрабатывается с почти нулевым расходом памяти.

Если файл бинарный или строк как таковых нет — читай блоками фиксированного размера:

with open('huge.bin', 'rb') as f:
    while chunk := f.read(1024 * 1024):  # по 1 МБ
        process(chunk)
Хайсер Аблаев Морж := в чтении блоков — топ, раньше писал while с лишней строкой · 11 месяцев назад
Владислав Рыженков Ключевой момент: for line in f НЕ грузит всё, в отличие от readlines() · 11 месяцев назад
8

Просто for line in f: — он читает по строке. Не используй read()/readlines().

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект