繁体   English   中英

处理 numpy arrays 和 Python 列表时的 RAM 使用情况

[英]RAM usage in dealing with numpy arrays and Python lists

我有 memory 个问题,不明白为什么。 我正在使用 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 的 arrays,它的值相同。 但是,如果我将这些 arrays 重塑为 4096x64,则会出现错误,因为使用了太多 RAM。

对于 3072x64 的 arrays,我可以看到 RAM 使用率越来越高,然后又下降了。

我的最终目标是将每个数组补零到 8192x64 的维度,但我的 session 之前崩溃了; 但这是另一个问题。

RAM是如何使用的? 为什么,如果 arrays 具有不同的维度,列表具有相同的大小? 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)

work 和total_size反映了列表的正确大小?

我有解决办法。

首先,正如Dan Mašek指出的那样,我正在测量数组使用的 memory,它是指针的集合(粗略地说)。 测量真实的 memory 用法:

(database_list[0].nbytes * len(database_list) / 1000000, "MB")

其中database_list[0].nbytes是可靠的,因为database_list中的所有元素都具有相同的大小。 更准确地说,我应该添加数组元数据以及最终链接到它的所有数据(例如,如果我在数组中存储其他结构)。

为了减少对 memory 的影响,我应该知道我正在读取的数据类型,即 0-65535 范围内的值,因此:

database_list = list()
for filename in glob.glob('*.npy'):
  temp_img = np.load(filename)
  temp_img = temp_img.reshape((-1, 64)).astype(np.uint16)
  database_list.append(temp_img)

此外,如果我对存储在 database_list 中的数据进行一些计算,例如,对 0-1 范围内的值进行归一化,如database_list = database_list/ 65535.0 (注意:database_list 作为列表,不支持该操作),我应该做另一个转换,因为 Python 将类型转换为类似 float64 的类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM