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