【发布时间】:2020-10-10 00:17:25
【问题描述】:
我有记忆问题,不明白为什么。我正在使用 Google Colab,它给了我 12GB 的 RAM,让我看看 RAM 的使用情况。
我正在从文件中读取np.array,并将每个数组加载到一个列表中。
database_list = list()
for filename in glob.glob('*.npy'):
temp_img = np.load(filename)
temp_img = temp_img.reshape((-1, 64)).astype('float32')
temp_img = cv2.resize(temp_img, (64, 3072), interpolation=cv2.INTER_LINEAR)
database_list.append(temp_img)
代码print("INTER_LINEAR: %d bytes" % (sys.getsizeof(database_list)))打印:
INTER_LINEAR:124920 字节
对于重新整形为 64x64、512x64、1024x64、2048x64 和 3072x64 的数组,它的值相同。但是,如果我将这些数组重新整形为 4096x64,则会出现错误,因为使用了太多 RAM。
对于 3072x64 的数组,我可以看到 RAM 使用率越来越高,然后又下降。
我的最终目标是将每个数组补零到 8192x64 的尺寸,但我之前的会话崩溃了;但这是另一个问题。
RAM 是如何使用的?为什么,如果数组有不同的维度,列表有相同的大小? python 是如何加载和操作这个文件的,这解释了 RAM 的使用历史?
编辑:
然后
sizeofelem = database_list[0].nbytes
#all arrays have now the same dimensions MxN, so despite its content, they should occupy the same memory
total_size = sizeofelem * len(database_list)
工作和total_size反映了列表的正确大小?
【问题讨论】:
-
因为保存每个 numpy 数组内容的数据保存在单独分配的内存块中。数组对象本身只是一堆元数据和指向数据缓冲区的指针,因此总是相同(小)大小。
-
@DanMašek 我添加了一个编辑;你能回应吗?然后我会结束这个问题。如果你能更彻底地解释你的答案,我会非常感激,即使现在很清楚。谢谢
-
您在编辑中计算的是数组内容使用的内存总大小。它不包括数组元数据,也不包括与列表相关的任何内容。但是,一个 4096x64 的 32 位浮点数数组是 1 MiB,因此仅使用
total_size就可以很容易地为您提供正确的估计值
标签: python numpy opencv google-colaboratory