Утечка памяти после функции fini sh in python - PullRequest
0 голосов
/ 25 марта 2020

Я только что обнаружил утечку памяти в коде 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, показанная память остается прежней.

Изображение - График памяти без процесса

Изображение - График памяти с процессом

Есть ли у нас объяснение этого и как правильно вы использовали при обращении к утечка памяти?

спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...