Я только что обнаружил утечку памяти в коде python и обнаружил, что память не освобождается после завершения функции. Пример проблемы я покажу ниже. Существует только класс, который сохраняет длинный список изображений, и функция, которая печатает этот список.
import sys
from pathlib import Path
import shutil
import psutil
import os
import cv2
import gc
src_path = Path('/home/ben/blob/1568204445571/')
path_list1 = list(src_path.iterdir())[:1000]
path_list2 = list(src_path.iterdir())[1000:2000]
class ListImg:
def __init__(self, list_img_path):
self.img_ls = [cv2.imread(str(img_path/'_.ppm')) for img_path in list_img_path]
def get_len_img_list(list_img_path):
List = ListImg(list_img_path)
_len = len(List.img_ls)
print(_len)
%memit
for path_list in [path_list1, path_list2]:
get_len_img_list(path_list)
%memit
Изображение - утечка памяти
Даже когда Я удаляю все связанные переменные, использование памяти все еще остается высоким
Я нашел способ решить эту проблему, запустив функцию в процессе.
process = psutil.Process(os.getpid())
%memit
for path_list in [path_list1, path_list2]:
print(process.memory_info().rss)
p = multiprocessing.Process(target=get_len_img_list, args=(path_list,))
p.start()
p.join()
%memit
Изображение - Устранить утечку памяти с помощью процесса
Проблема не связана с jupyter, потому что, когда я запустил его в чистом коде python, показанная память остается прежней.
Изображение - График памяти без процесса
Изображение - График памяти с процессом
Есть ли у нас объяснение этого и как правильно вы использовали при обращении к утечка памяти?
спасибо