如题,程序运行到一半,需要读取之前处理过的临时文件的数据,于是申请了一个100多M的大数组,但提示内存不足,查看了一下程序总共只花费了200多M内存,整台电脑仍剩余26G的空闲物理内存。
除了申请数组之外,创建内存文件映射也出现了这个问题,程序需要处理一个1G多的数据文件,初始化时如果使用内存文件映射直接就提示内存不足了,被迫把文件分割成N个数据块处理,但是这样一来就处理速度无法满足需求了。
求问是什么原因?
这个申请内存是有限制的,不是你内存有多少闲置空间就可以申请多大内存啊
好吧,查了好多资料暂且算是解决了,给个大致的参考原因吧。C#不同于C++,它的引用类型是存在堆上、值类型是存在栈上的,但数组比较特殊,它存储于堆上,但地址映射于栈上,它不占用栈空间但占用栈地址。对别的语言的程序来说这没有影响,这个地址的映射是在CLR中进行的,仅对本进程有效。因此对C#程序来说当栈地址不够用时地址空间会向虚拟内存扩展,如果虚拟内存设得太小,且申请的空间比较分散,就会导致空闲地址非常零散没有足够的连续地址来存放一个大数组,这跟实际物理内存没关系,把虚拟内存改大就好了,只是为了占用一下它的扩展地址而已,扩展之后作为栈地址的虚拟内存地址会优先映射到堆上,堆空间不够用了才会真正消耗磁盘虚拟内存。
内存不足不是真的物理内存不足,是你的数组长度过长,已经超出了指针范围
以64位模式运行有可能解决这个问题,因为64位比32位寻址大太多了,但是你引用的32位dll会报错
如果必须以32位运行,只能分批处理了
32位程序最大就只能认4G内存。