Как убить экземпляр класса после создания, чтобы освободить память в python? - PullRequest
0 голосов
/ 08 июля 2019

У меня есть код Python, который состоит из последовательной инициализации 2 классов.Я инициализирую класс A (выравнивание), что-то делаю, а затем инициализирую класс B, но класс A все еще находится в памяти, поэтому не хватает места для инициализации класса B. Классы написаны на python и тензорном потоке.Оба класса работают на GPU (один GPU).Теперь, как я могу убить класс A перед запуском класса B?

Также я попробовал деструктор python, weakRef и gc.collect ().

import os 
import sys
from subprocess import call
import weakref 
import gc
import time

sys.path.insert(0, 'alignment')
import alignment 


## initializing class A
align = alignment.Verification('./alignment/')
for subdir, dirs, files in os.walk(input_path):
    ## do something here

## end of the class A 
print('End of pre-processing ...')
## Here, the class A should be killed!
del align
gc.collect()

## start training (using tensorflow)
command = 'CUDA_VISIBLE_DEVICES="0" python3 train.py'
call([command], shell=True)

Ответы [ 2 ]

0 голосов
/ 15 июля 2019

Через несколько дней я обнаружил, что нет способа освободить память, не убив интерпретатор python в тензорном потоке. Но хитрый способ! Вы можете использовать подпроцесс и добавить к нему свой класс, а затем уничтожить подпроцесс, чтобы закрыть сеанс тензорного потока. Например:

‍‍ first = subprocess.Popen(["python", "class_A.py"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) first.communicate() # wait until session end first.kill()

0 голосов
/ 08 июля 2019

Попробуйте переопределить деструктор, освободив все ресурсы, которые есть в вашем классе alignment.

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