复制数组时的 numpy 内存管理

numpy memory management when copying arrays

我正在尝试通过以下方式读取 numpy 数组 images 中的图像:

 import os
 import psutil
 import numpy as np
 from skimage.transform import resize
 from skimage.io import imread

 img_names = sorted(glob(my_dir + '/' + '*.jpg'))
 images = np.empty((len(img_names),) + basic_shape, dtype='float32')

 process = psutil.Process(os.getpid())
 print('MEM:', process.memory_info().rss)
    
 for i in range(0, len(img_names)):
    images[i] = resize(imread(img_names[i]), basic_shape)

 process = psutil.Process(os.getpid())
 print('MEM:', process.memory_info().rss)

在我开始阅读之前 process.memory_info().rss 说该进程正在使用 926846976 bytes。阅读后,该过程正在使用 2438307840 bytes,大约是以前的 2.5 倍。

为什么读取后进程内存增加那么多,有什么办法可以减少读取图像时分配的内存大小?

CPython是garbage collected,这意味着对象在不再需要之后可能会在内存中停留更长的时间,最终它们会被批量从内存中移除。

您可以使用 gc 模块进行垃圾回收,特别是在循环中调用 gc.collect() 可能会有所帮助。有关更多信息,请参阅其他问题:

How can I explicitly free memory in Python?

请注意顶部答案下的许多评论,我将其总结为“您的里程可能会有所不同”。

无论如何,我将首先修改您的脚本以进行诊断,然后尽可能降低内存使用率:

import gc
import os
import psutil
import numpy as np
from skimage.transform import resize
from skimage.io import imread

img_names = sorted(glob(my_dir + '/' + '*.jpg'))
images = np.empty((len(img_names),) + basic_shape, dtype='float32')

process = psutil.Process(os.getpid())
print('MEM:', process.memory_info().rss)
    
for i in range(0, len(img_names)):
    tmp = imread(img_names[i])
    images[i] = resize(tmp, basic_shape)
    # del tmp
    # gc.collect()  # try these two lines

process = psutil.Process(os.getpid())
print('MEM:', process.memory_info().rss)

gc.collect()  # force garbage collection

process = psutil.Process(os.getpid())
print('MEM:', process.memory_info().rss)

我还推荐 memory_profiler 包来监控您的脚本随着时间的推移以及每行的内存使用情况。