我想尽可能多地加载数据,以便当前进程和其他进程都能正常工作。我宁愿只使用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] 删除。
我来说两句