Вы не можете видеть из исключения MemoryError
, и исключение возникает для любой ситуации, когда выделение памяти не удалось, включая внутренние компоненты Python, которые напрямую не связаны с кодом, создающим новые структуры данных Python;некоторые модули создают блокировки или другие вспомогательные объекты, и эти операции могут завершаться сбоем из-за нехватки памяти.
Вы также не можете точно знать, сколько памяти потребуется для успешного выполнения всей операции.Если библиотека создает несколько структур данных в ходе работы, попытка выделить память для строки, используемой в качестве ключа словаря, может быть последней каплей или копированием всей существующей структуры данных для мутации или чего-либо промежуточного, ноэто ничего не говорит о том, сколько памяти потребуется, кроме того, для оставшейся части процесса.
Тем не менее, Python может дать вам подробную информацию о том, какие выделения памяти производятся, икогда и где, используя модуль tracemalloc
.Используя этот модуль и экспериментальный подход, вы можете оценить, сколько памяти потребуется вашему набору данных.
Хитрость заключается в том, чтобы найти наборы данных, для которых процесс может быть завершен.Вы хотели бы найти наборы данных разных размеров, и затем вы можете измерить, сколько памяти требуется для этих структур данных.Вы создадите моментальные снимки до и после с помощью tracemalloc.take_snapshot()
, сравните различия и статистику между моментальными снимками для этих наборов данных, и, возможно, вы сможете экстраполировать из этой информации, насколько больше памятибольший набор данных потребуется.Конечно, это зависит от характера операции и наборов данных, но если есть какая-либо схема, tracemalloc
- лучший способ ее обнаружить.