Хотя я решил свою проблему, полностью изменив свой алгоритм, мне все еще любопытно, почему в моем первом подходе была утечка памяти, см. Ниже.
Я хочу обрабатывать группы в кадре данных pandas.я использую:
def function(template_df,group):
for row in group.iterrows():
** edit template_df **
return template_df
if __name__ == '__main__':
with Pool(processes=6) as pool:
multiple_results = [pool.apply_async(function,(template_df,group)) for name,group in dataframe.groupby(['Col1'])]
results_all = [res.get() for res in multiple_results]
pool.close()
pool.terminate()
pool.join()
for i in range(0,len(results_all)):
meta_df= meta_df.add(results_all[i])
results_all =[]
multiple_results = []
Функция возвращает небольшой фрейм данных, отредактированный данными в каждой группе.Затем я объединяю эти небольшие кадры данных в один.
В основном кадре данных много групп, и да, сохраняются десятки тысяч таких шаблонов, но они имеют размер только 150x150 элементов, и мойСистема имеет 110 ГБ ОЗУ, так что все должно быть в порядке.
На самом деле список results_all
не так уж велик.установка его в ноль не освобождает память, как и multiple_results
.
Я проверил все свои переменные с помощью sys.getsizeof
, и ни одна из них не растет вне ожиданий, большинство на самом деле не растутна всех, поскольку они являются кадрами данных фиксированного размера.Тем не менее, объем памяти только увеличивается.каждый миллион строк основного фрейма данных, который я обрабатываю, занимает 30 ГБ ОЗУ, а я удаляю новый файл template_df, который я создаю.
Что мне здесь не хватает?
Решение : Я изменил функцию, чтобы выводить список индексов для меня, чтобы воссоздать шаблоны данных, чтобы я мог переключиться на функцию карты и просто передать группы как итеративные.Это полностью устранило утечку памяти.
Очевидно, что это проблема с передачей / возвратом кадров данных из пула.
...
Но кто-нибудь может сказать мне, в чем заключалась проблема с первым подходом?