如何使用所有可用内存

弗拉基米尔·列宁

我想尽可能多地加载数据,以便当前进程和其他进程都能正常工作。我宁愿只使用RAM(不使用swap),但欢迎任何建议。过多的数据可以被丢弃。正确的做法是什么?如果我只是等待MemoryException,系统将无法运行(如果使用列表)。

data_storage = []
for data in read_next_data():
  data_storage.append(data)

最终将数据加载到numpy数组中。

塞弗特

psutil具有一个virtual_memory函数,函数除其他外包含一个表示可用内存的属性:

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

>>> psutil.virtual_memory().free
1743937536

那应该是非常准确的(但是函数调用是昂贵的-慢-至少在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)这样,您就不会保留这些列表,并且可以避免内存增加一倍。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章