#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(), который является итератором, в функцию, возвращающую генератор, поскольку генераторы вычисляют новый индекс, который необходимо прочитать, а не хранить все индексы.
Чтобы узнать больше о генераторах, перейдите по следующей ссылке: