← Все вопросы
Как прочитать огромный файл (несколько гигабайт), не загружая его в память целиком?
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().
Ваш ответ
Войдите, чтобы ответить на вопрос.