如何使用所有可用内存

Vla*_*nin 3 python memory memory-management numpy python-3.x

我想加载尽可能多的数据,这是安全的,这样当前的流程和其他流程一样正常.我宁愿只使用RAM(不使用交换),但欢迎任何建议.可以丢弃过多的数据.这样做的正确方法是什么?如果我等待MemoryException,系统将无法运行(如果使用列表).

data_storage = []
for data in read_next_data():
  data_storage.append(data)
Run Code Online (Sandbox Code Playgroud)

数据最终被加载到numpy数组中.

MSe*_*ert 5

psutil有一个virtual_memory函数,除其他外,还包含一个表示空闲内存的属性:

>>> psutil.virtual_memory()
svmem(total=4170924032, available=1743937536, percent=58.2, used=2426986496, free=1743937536)

>>> psutil.virtual_memory().free
1743937536
Run Code Online (Sandbox Code Playgroud)

这应该是非常准确的(但函数调用是昂贵的 - 至少在Windows上).的MemoryError因此,如果阵列的存储超过总缴费(免费或不)RAM它仅提出不采取由其他proccesses考虑存储器.

您可能必须猜测您停止累积的位置,因为可用内存可能会发生变化(其他进程也需要不时需要一些额外的内存),并且转换为numpy.array可能会暂时加倍使用的内存,因为此时列表和数组必须适合你的RAM.


但是,您也可以通过不同方式处理此问题:

  • 读入第一个数据集:read_next_data().
  • 计算此时的空闲内存: psutil.virtual_memory().free
  • 使用shape第一个数据集和dtype计算适合RAM的阵列形状.假设它使用factor(即75%)可用的可用内存:rows= freeMemory * factor / (firstDataShape * memoryPerElement)这应该为您提供一次读入的数据集的数量.
  • 创建一个这种形状的数组:arr = np.empty((rows, *firstShape), dtype=firstDtype).
  • 加载下一个数据集,但将它们直接存储到数组中arr[i] = next(read_next_data).这样你就不会保留这些列表而避免增加内存.