python - 处理 numpy 数组和 Python 列表时的 RAM 使用情况
问题描述
我有记忆问题,不明白为什么。我正在使用 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
反映列表的正确大小?
解决方案
我有解决办法。
首先,正如Dan Mašek指出的那样,我正在测量数组使用的内存,它是指针的集合(粗略地说)。要测量实际内存使用情况:
(database_list[0].nbytes * len(database_list) / 1000000, "MB")
wheredatabase_list[0].nbytes
是可靠的,因为其中的所有元素database_list
都具有相同的大小。更准确地说,我应该添加数组元数据并最终添加链接到它的所有数据(例如,如果我将其他结构存储在数组中)。
为了减少对内存的影响,我应该知道我正在读取的数据类型,即 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 之类的东西。
推荐阅读
- python-3.x - 解析命名空间 xml 生成 AttributeError: 'str' object has no attribute 'text'
- angular - 如何在运行函数Angular之前等待从Firestore加载数据
- arrays - React Material-Table - 如何在从获取的数组呈现的单元格之间添加逗号?
- monitoring - Windows 服务集成后如何在 New relic 仪表板中查找有关服务的详细信息
- ansible - 如何使用ansible替换json文件中键的值
- javascript - 使用动态生成的值更新数组
- javascript - 我可以仅使用 wordpress elementor 创建带有图像和描述的团队成员滑块吗?
- excel - 自动从具有相似名称的其他工作簿中的特定工作簿中获取数据
- satellite - 我可以在谷歌引擎地图上放大吗
- java - 在 quarkus 测试容器中手动运行 flyway 反应式