我想加载尽可能多的数据,这是安全的,这样当前的流程和其他流程一样正常。我宁愿只使用RAM(不使用交换),但欢迎任何建议。可以丢弃过多的数据。这样做的正确方法是什么?如果我等待MemoryException
,系统将无法运行(如果使用列表)。
data_storage = []
for data in read_next_data():
data_storage.append(data)
最终将数据加载到numpy数组中。
答案 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
shape
和dtype
来计算适合放入RAM的阵列的形状。我们假设它使用factor
(即75%)可用的可用内存:rows= freeMemory * factor / (firstDataShape * memoryPerElement)
,它可以为您提供一次读入的数据集的数量。arr = np.empty((rows, *firstShape), dtype=firstDtype)
。arr[i] = next(read_next_data)
中。这样你就不会保留这些列表而避免增加内存。