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数组中.
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().freeshape第一个数据集和dtype计算适合RAM的阵列形状.假设它使用factor(即75%)可用的可用内存:rows= freeMemory * factor / (firstDataShape * memoryPerElement)这应该为您提供一次读入的数据集的数量.arr = np.empty((rows, *firstShape), dtype=firstDtype).arr[i] = next(read_next_data).这样你就不会保留这些列表而避免增加内存.| 归档时间: |
|
| 查看次数: |
1072 次 |
| 最近记录: |