Python WindowsLinuxmacOSPython 3

Python: При чтении большого файла Python завершается из-за нехватки памяти

  • Обновлено
  • Чтение ≈ 3 минуты

Краткий ответ

При чтении огромного файла одной операцией read() или readlines() процесс Python может расходовать гигабайты оперативной памяти и аварийно завершаться; для потоковой обработки нужны итерация и ограниченные порции.

В этой статье
  1. Что произошло и когда проявляется ошибка
  2. Причины и диагностические признаки
  3. Подробная пошаговая диагностика и исправление
  4. Как проверить, что проблема устранена
  5. Если исправление не помогло

#Что произошло и когда проявляется ошибка

При чтении огромного файла одной операцией read() или readlines() процесс Python может расходовать гигабайты оперативной памяти и аварийно завершаться; для потоковой обработки нужны итерация и ограниченные порции.

#Причины и диагностические признаки

Возможная причинаКак узнатьЧто делать
Загружается файл целикомВ памяти одновременно хранятся исходные байты, строки и новые структуры.Падение на Path.read_text(), read() или списке строкОбрабатывать построчно или порциями.
Результаты накапливаются бесконечноПрограмма сохраняет все записи в список или словарь.Память растёт по мере обработки даже при чтении строкПисать результат постепенно.
Разбор JSON требует всего документаСтандартный json.load строит полный объект в памяти.Проблема при json.load() большого массиваПерейти на построчный JSONL или подходящий потоковый разбор.

#Подробная пошаговая диагностика и исправление

  1. 1. Зафиксируйте размер и место сбояСделайте копию тестовых данных. В проводнике посмотрите размер файла; в Linux/macOS используйте ls -lh файл. Посмотрите, на какой операции возник MemoryError или код завершения процесса. При отсутствии Python-исключения ОС могла завершить процесс по лимиту памяти; уточните журнал системы.
  1. 2. Проверьте текущий способ чтенияОткройте копию скрипта в редакторе и найдите read(), readlines(), list(file) и большие списковые включения. Выделите этап, где одновременно создаются исходный текст и массив результатов. Не создавайте сразу ещё одну копию огромного набора ради отладки.
  1. 3. Замените чтение целиком на построчный циклДля текстового файла с независимыми строками запишите обработку по одной строке; корректно укажите кодировку. В примере подсчитываются строки без накопления содержимого. Вводите errors= только осознанно: ignore скрывает повреждение данных.
  2. Пример кода по теме
    Python
    Образец кода для файла .py в тестовой копии проекта; перед внедрением замените имена файлов на реальные.
    count = 0
    with open("big.txt", "r", encoding="utf-8") as f:
        for line in f:
            count += 1
    print("Строк:", count)
  1. 4. Для преобразования сразу записывайте результатВместо списка result.append(...) создайте новый файл вывода с суффиксом .new, открыв его в режиме x, и записывайте преобразованную строку сразу. Это снижает потребление памяти, но требует запаса места на диске и проверки правильности преобразования.
  2. Пример кода по теме
    Python
    Демонстрация для текстовых строк; форматирование и сохранение переводов строк адаптируйте под свой формат.
    with open("big.txt", encoding="utf-8") as src, open("output.new", "x", encoding="utf-8") as dst:
        for line in src:
            dst.write(line.strip().upper() + "\n")
  1. 5. Для CSV и JSON выберите подходящий форматДля CSV используйте csv.reader поверх открытого файла и сразу обрабатывайте запись; не оборачивайте итератор в list(). Для JSON-массива стандартный json.load не подходит для потоковой экономии памяти — по возможности меняйте источник на JSONL либо используйте проверенный специализированный потоковый парсер после оценки его ограничений.
  1. 6. Сравните результаты и нагрузкуЗапустите скрипт сначала на маленькой копии с известным числом строк, затем на большом файле. В диспетчере задач или top наблюдайте память и время; сравните итоговое количество записей и контрольные выборки перед заменой рабочего результата.

#Как проверить, что проблема устранена

Скрипт завершает обработку на рабочем объёме данных, память не растёт пропорционально числу обработанных строк; результаты проверены на тестовых выборках.

#Если исправление не помогло

Если ошибка остаётся, отдельно проверьте накопление результатов, утечки в сторонних библиотеках и лимиты контейнера. Увеличение памяти — последний шаг после измерений.

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.