在一台32位机上运行同一个计算程序,有时能成功运行,有时Unable to allocate 218MiB for an array。不到300M内存都不足。
import psutil
import traceback
import numpy as np
mem = psutil.virtual_memory()
zj=float(mem.total)/(1024*1024)
ysy=float(mem.used)/(1024*1024)
kx=float(mem.free)/(1024*1024)
print("1:系统总计内存%.3f MB, 系统已使用内存%.3f MB, 系统空闲内存%.3f MB"%(zj, ysy, kx))
try:
print('model start')
offline_process() #数据处理程序,内部涉及从其他文件获取数据用numpy处理
#程序需要创建很多数组,有成功案例,但是大多数是在创建 shape(34,838484)的数组时报错的
print("offline processing finished")
mem = psutil.virtual_memory()
zj=float(mem.total)/(1024*1024)
ysy=float(mem.used)/(1024*1024)
kx=float(mem.free)/(1024*1024)
print("2:系统总计内存%.3f MB, 系统已使用内存%.3f MB, 系统空闲内存%.3f MB"%(zj, ysy, kx))
except:
traceback.print_exc()
mem = psutil.virtual_memory()
zj=float(mem.total)/(1024*1024)
ysy=float(mem.used)/(1024*1024)
kx=float(mem.free)/(1024*1024)
print("error:系统总计内存%.3f MB, 系统已使用内存%.3f MB, 系统空闲内存%.3f MB"%(zj, ysy, kx))
用spyder运行以上.py代码,可能会成功,也可能会报错
运行成功时:
控制台显示:
1:系统总计内存3506.219 MB, 系统已使用内存1610.547 MB, 系统空闲内存1895.672 MB
model start
offline processing finished
2:系统总计内存3506.219 MB, 系统已使用内存2048.359 MB, 系统空闲内存1457.859 MB
运行失败报错时:
控制台显示:
1:系统总计内存3506.219 MB, 系统已使用内存1543.348 MB, 系统空闲内存1962.871 MB
model start
error:系统总计内存3506.219 MB, 系统已使用内存2033.484 MB, 系统空闲内存1472.734MB
MemoryError:Unable to allocate 218.MiB for an array with shape(34,838484) and data type float64
在64位机上运行都会成功。最疑惑的是有些时候spyder运行成功,有时候失败,但是在失败报错后关闭spyder后重启再运行成功率会上升,而且一般报错内存不足后不退出spyder直接继续运行多半还是内存不足,而且会在中间步骤报错:MemoryError:Unable to allocate 46.MiB for an array with shape(34,838484) and data type float64,在中间步骤就出错。所以才想是32位机器内存不足,用psutil.virtual_memory()方法查看已使用与空闲内存,但是发现空闲内存很多,启动任务管理器实时监视也会发现物理内存充足。
我想询问的内容是如何查看numpy数组创建时,可供分配的剩余内存究竟是多少,还是说spyder或者python限制了可分配的内存。218.MiB数组并不大,也有成功运行的可能性,但是不稳定,即使重启电脑也可能不知道为什么就内存不足了。我希望能够找到准确查看内存,运行程序的方法。