gpt4 book ai didi

python - numpy数组中的内存管理,python

转载 作者:太空宇宙 更新时间:2023-11-03 16:11:51 26 4
gpt4 key购买 nike

处理非常大(>50Gb)的文件时出现内存错误(问题:RAM 内存已满)。

我的解决方案是:我只想读取一次 500 KB 的数据并进行处理(并将其从内存中删除并继续处理下一个 500 kb)。还有其他更好的解决方案吗?或者如果这个解决方案看起来更好,如何使用 numpy 数组来实现?

这只是 1/4 的代码(仅供引用)

  import h5py
import numpy as np
import sys
import time
import os
hdf5_file_name = r"test.h5"
dataset_name = 'IMG_Data_2'

file = h5py.File(hdf5_file_name,'r+')
dataset = file[dataset_name]
data = dataset.value
dec_array = data.flatten()
........

此时我遇到内存错误,因为它尝试将所有数据放入内存。

最佳答案

快速回答

更长的答案

一个关键问题是您有多少 RAM(<10GB,>10GB)以及您正在执行什么样的处理(需要一次查看数据集中的每个元素或需要一次查看整个数据集) .

如果它小于 10GB 并且需要查看一次,那么您的方法似乎是最合适的方法。这是处理大于主内存的数据集的标准方法。我要做的是将 block 的大小从 500kb 增加到更接近您拥有的内存量 - 也许是物理 RAM 的一半,但无论如何,在 GB 范围内,但不足以大到导致交换到磁盘和干扰你的算法。一个很好的优化是同时在内存中保存两个 block 。一个是进程,另一个是从磁盘并行加载。这是可行的,因为从磁盘加载内容相对昂贵,但它不需要太多 CPU 工作 - CPU 基本上是在等待数据加载。由于 GIL,在 Python 中很难做到这一点,但 numpy 和 friend 不应该受此影响,因为它们在数学运算期间释放 GIL。 threading 包在这里可能有用。

如果您的 RAM 较低并且需要立即查看整个数据集(也许在计算某些二次时间 ML 算法时,甚至在数据集中进行随机访问时),事情会变得更加复杂,您可能不会能够使用之前的方法。要么将您的算法升级为线性算法,要么您需要实现一些逻辑,以使 numpy 等中的算法直接处理磁盘上的数据,而不是将其保存在 RAM 中。

如果您有 >10GB 的 RAM,您可以让操作系统为您完成艰苦的工作,并增加交换大小足以捕获所有数据集。这样,所有内容都会加载到虚拟内存中,但只有一部分子集会加载到物理内存中,并且操作系统会处理它们之间的转换,因此所有内容看起来都像一个巨大的 RAM block 。不过,如何增加它是特定于操作系统的。

关于python - numpy数组中的内存管理,python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39223838/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com