PBS vmem превысил лимит: Как я могу узнать, где превышен объем памяти?

#python #memory #multiprocessing #shapefile #psutil

Вопрос:

У меня есть шейп-файл с 1500000 полигонами, мне нужно перейти к каждому полигону и пересечь его разными сетками.

Я создал простую программу, которая переходит от полигона к полигону для пересечения (с многопроцессорной обработкой),

 pool = mp.Pool() 
for index,pol in shapefile.iterrows():
        # Limits each polygon in shapefile     
        ylat = lat_gridlimits
        xlon= lon_gridlimits
        args.append((dgrid,ylat,xlon,pol,index))      
pool.starmap(calculate,args) 
pool.close() 
pool.join()

 

но память заполняется очень быстро, и я получаю ошибку

PBS: задание выполнено: vmem превысил лимит

Как я могу узнать, где или когда память превышает? или есть способ контролировать память в каждой функции?

Я попробовал это (внутри вычислить):

 process = psutil.Process(os.getpid())
mem=process.memory_info().rss/(1024.0 ** 3)
vmem=psutil.virtual_memory().total / (1024.0 ** 3)
print("{}  {}n".format(mem,vmem)) 
 

но это не помогает мне определить, где

Комментарии:

1. Какую операционную систему вы используете?

Ответ №1:

Одна из причин, по которой у вас заканчивается память, может заключаться в том, что вы используете итератор в цикле for для перебора очень большого набора данных. Повторение этого набора может занять больше памяти, чем программе python разрешено использовать в вашей системе. Один из способов экономии памяти-переписать шейп-файл.iterrows(), который является итератором, в функцию, возвращающую генератор, поскольку генераторы вычисляют новый индекс, который необходимо прочитать, а не хранить все индексы.

Чтобы узнать больше о генераторах, перейдите по следующей ссылке:

https://pythongeeks.org/python-generators-with-examples/