Проблемы с памятью Python27
Я пытаюсь обработать некоторые данные, используя python, но часто сталкиваюсь с "MemoryError". Для обработки данных мне нужно выполнить цикл ~400 раз. Проблема в том, что каждый раз, когда я вхожу в этот цикл 20-30 раз, я получаю "MemoryError". При просмотре диспетчера задач это происходит, когда python.exe*32 равен ~1 ГБ. Я бы использовал 64-битный Python, но некоторые библиотеки мне нужны только 32-битные. Кроме того, в конце основной функции, которую я вызываю в каждом цикле, я использую функцию del практически для каждой переменной, которую я использую. Когда возникает "MemoryError", я должен полностью выйти из интерпретатора, в противном случае, если я попытаюсь повторно запустить его снова, он автоматически завершится с "MemoryError".
Я использую Python(x,y) 2.7 и мне нужно следующее: numpy scipy.io matplotlib pyopencl pyfft
1 ответ
Вы сказали, что он разбился на линии, как это:
s = zeros((A,B,C),complex128)
С А =2400, В =256, С =25. Это потребует 235 МБ памяти. И не только 235 МБ: он должен быть смежным, потому что NumPy ожидает использовать его как единый массив.
Вы также упомянули, что запускаете это в 32-битном процессе и что он завершается сбоем, когда использование памяти процесса составляет около 1 ГБ.
Это прискорбно, но не совсем удивительно. Учтите, что общая полезная виртуальная память в 32-разрядном процессе составляет где-то около 3 ГБ, и неизбежно будут некоторые "дыры", что означает, что вы никогда не сможете выделить один массив размером 4 ГБ. Но сколько вы можете выделить в одной части? Что ж, это зависит от фрагментации памяти, выделенной вами до сих пор, так как виртуальные адреса, которые все еще нужны вашей программе, могут "рассыпаться" вокруг ее адресного пространства в 4 ГБ, и в конечном итоге вы не сможете выделить четверть гигабайта. все вместе
Что вы должны сделать здесь, это выделить свою матрицу один раз и использовать ее повторно. Когда ваша программа только что запустилась, вы с большой вероятностью преуспеете в выделении массива размером 235 МБ, и позже вы сможете очистить его, прежде чем использовать повторно, не выделяя снова.
В качестве альтернативы вы можете (а) перейти на 64-разрядную версию или (б) потратить потенциально довольно много времени на отслеживание того, почему вы не можете выделить большой непрерывный кусок после некоторого запуска языка сборки мусора.