Присвоение массива numpy новому массиву numpy не освобождает память старых массивов - PullRequest
4 голосов
/ 06 ноября 2019

Если бы я запустил приведенный ниже код, я бы ожидал, что второе назначение array_1 освободит используемую старую память array_1, но похоже, что копия сохраняется даже после принудительного вызова gc. Пример:

import numpy as np
import psutil
import os
import gc

BIG_ARRAY = 1280*3*960
process = psutil.Process(os.getpid())

def make_frames(num):
    frames = []
    for i in range(int(num)):
        frames.append(np.arange(BIG_ARRAY).astype(float))
    return frames

def print_current_memory_usage(msg=''):
    process = psutil.Process(os.getpid())
    print('Using {:.2} GBs of mem for {}'.format(process.memory_info().rss/1E9, msg))


print_current_memory_usage('Initial mem')
array_1 = make_frames(1E2)
print_current_memory_usage('Mem after making large object')
array_1 = make_frames(1E2)
print_current_memory_usage('Mem after replacing old large object (expect mem to stay same)')
gc.collect()
print_current_memory_usage('Mem gc (expect to change if this is just a gc timing issue)')

Я неоднократно получаю следующий вывод:

Using 0.028 GBs of mem for Initial mem 
Using 3.0 GBs of mem for Mem after making large object 
Using 5.9 GBs of mem for Mem after replacing old large object (expect mem to stay same) 
Using 5.9 GBs of mem for Mem gc (expect to change if this is just a gc timing issue)

Это как если бы исходная копия array_1 не была освобождена. Может кто-нибудь объяснить, почему это будет?

Обратите внимание, что это только в том случае, если добавляемый массив представляет собой массив numpy, если я просто добавляю список, т.е. говорю frames.append([i for i in range(BIG_ARRAY)]), вместо этого я получаю ожидаемый результат:

Using 0.028 GBs of mem for Initial mem
Using 4.1 GBs of mem for Mem after making large object
Using 4.1 GBs of mem for Mem after replacing old large object (expect mem to stay same)
Using 4.1 GBs of mem for Mem gc (expect to change if this is just a gc timing issue)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...