如何使用所有可用内存

时间:2017-01-30 08:45:55

标签: python python-3.x numpy memory memory-management

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

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

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

1 个答案:

答案 0 :(得分:5)

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总量的情况下才会引发它。

你可能不得不猜测你停止累积的点,因为可用内存可能会发生变化(其他进程也需要一些额外的内存),转换到numpy.array可能会暂时加倍你的内存,因为在那个时候列表和数组必须适合你的RAM。

但是你也可以用不同的方式来解决这个问题:

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