复制数组时的 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
包来监控您的脚本随着时间的推移以及每行的内存使用情况。
我正在尝试通过以下方式读取 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
包来监控您的脚本随着时间的推移以及每行的内存使用情况。