在实际开发中,需要读取文件转成byte数组,文件大小四五百兆,采用win10系统,我那台电脑系统版本非常老了,一直没升级,读取文件时,就会出现OutOfMemeory异常,时不时的出现。我程序用的anycpu架构,比x86架构的最大可与行内存大一些,按理说不到1g的内存,应该装的下才对,不应该内存溢出。
后来经过查阅资料,发现很大的原因是因为:连续内存不足,运行时找不到这么大的连续内存了,数组是连续内存,所以就报这种异常。解决办法是使用链表,LinkList,链表就不是使用的连续内存。我用LinkList这种结构,每个byte[]大小1兆,这样子,我就能装下四五百兆的内容,还不报内存溢出。
我模仿数组实现了索引,模仿Array.Copy,构造的Copy方法。总之最终不用大改代码,取代了常规数组。
这里有个疑问:每new一个byte[]数组难道不也是内存挨着new的吗,比如连续new10个bye[]数组,它们的每个数组难道在内存上不是相邻的吗 a[0],地址:0x1;a[1],0x2;b[0],0x3;b1[0]0x4,这种样子。
如果连续内存足够,应该是连续分配对象内存,否则就不是连续分配了。
我在想,虽然LinkedList是开辟不连续内存的,但是在把new byte[]数组加入该集合前,不是已经new了一下,开辟好了内存啊,LinkedList加入这个数组时,只需对其引用,似乎体现不出来这种不连续内存的地方所在,似乎用List也行。
但仔细想,List要求元素的内存连续,如果 已经不能分配连续内存了,那么这个新分配的数组就无法加入到List集合了,而使用LinkedList,因其支持不连续内存,所以允许零散的byte[]数组加入其集合。所以对于要存几百兆的大数组,还是用这种LinkedList比较好。
为什么不直接使用LinkedList,因为我试了,一样内存溢出,值类型又不分配堆内存,所以我觉得这样就相当于List了。
以上就是关于大数组对象,内存溢出的处理办法。
原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/tech/aiops/268291.html