• C# 使用大数组内存溢出的解决办法


    在实际开发中,需要读取文件转成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了。
    以上就是关于大数组对象,内存溢出的处理办法。
     
  • 相关阅读:
    Dockerfile 指令 VOLUME 介绍
    Spring boot(4)-应用打包部署
    Docker Dockerfile详解
    poj-1045(数学不好怪我咯)
    poj-3185-开关问题
    poj-1163-The Triangle
    归并排序(Merge Sort)
    交换排序—快速排序(Quick Sort)
    交换排序—冒泡排序(Bubble Sort)
    选择排序—堆排序(Heap Sort) 没看明白,不解释
  • 原文地址:https://www.cnblogs.com/HelloQLQ/p/16388011.html
Copyright © 2020-2023  润新知