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