在实际开发中,需要读取文件转成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了。
以上就是关于大数组对象,内存溢出的处理办法。
 

C# 使用大数组内存溢出的解决办法的更多相关文章

  1. android通过BitmapFactory.decodeFile获取图片bitmap报内存溢出的解决办法

    android通过BitmapFactory.decodeFile获取图片bitmap报内存溢出的解决办法 原方法: public static Bitmap getSmallBitmap(Strin ...

  2. OutOfMemoryError(内存溢出)解决办法

    第一种OutOfMemoryError: PermGen space 发生这种问题的原意是程序中使用了大量的jar或class,使java虚拟机装载类的空间不够,与Permanent Generati ...

  3. WPF循环加载图片导致内存溢出的解决办法

    程序场景:一系列的图片,从第一张到最后一张依次加载图片,形成“动画”. 生成BitmapImage的方法有多种: 1. var source=new BitmapImage(new Uri(" ...

  4. htmlunit 导致高cup占用,一老内存溢出的解决办法

    原文:http://blog.csdn.net/qq_28384353/article/details/52974432#reply 将爬虫部署到服务器上运行后,在查看服务器的状态监控时发现,天猫爬虫 ...

  5. jdbc读取百万条数据出现内存溢出的解决办法

    本人在做项目实施时,我们使用的是mysql数据库,在不到一个月的时间已经有了2千万条数据,查询的时候非常慢,就写了一个数据迁移的小项目,将这两千万条数据存放到MongoDB中看效率怎么样,再读取数据时 ...

  6. eclipse启动Tomcat加载项目时报内存溢出错误解决办法

    在eclipse中点击Window->Preferences打开全局属性设置对话框,如下图所示设置Tomcat运行时的JVM参数,添加这段JVM设置:-Xms256M -Xmx768M -XX: ...

  7. git在windows下clone、pull或者push内存溢出的解决办法

    发现国内使用git来真正管理源码的人不多,特别是大数据量的源码,今天使用git clone android的源码时突然出现remote out of memery,解决办法: git config - ...

  8. Tomcat常见内存溢出的解决办法

    PermGen space错误解决方法 在看下文之前,首先要确认意见事情,就是你是如何启动tomcat的,我们在平时的开发环境当中,都是通过startup.bat方式启动tomcat的,那么你按照下面 ...

  9. javascript innerHTML 大数据量加载 导致IE 内存溢出 的解决办法

    在做 ajax 滚动加载的时候,越到后面 数据量越大,使用obj.innerHTML+=row添加到页面的时候,出现ie内存不足的情况,此时使用createDocumentFragment,创建一个文 ...

  10. java内存溢出的解决思路

    原文地址:https://www.cnblogs.com/200911/p/3965108.html 内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能 ...

随机推荐

  1. MogDB 操作系统优化指南

    MogDB 操作系统优化指南 本文出处:https://www.modb.pro/db/413280 在性能调优过程中,可以根据实际业务情况修改关键操作系统(OS)配置参数,以提升 MogDB 数据库 ...

  2. HarmonyOS非线性容器特性及使用场景

      非线性容器实现能快速查找的数据结构,其底层通过hash或者红黑树实现,包括HashMap.HashSet.TreeMap.TreeSet.LightWeightMap.LightWeightSet ...

  3. 基于eTS高效开发HarmonyOS课程类应用

    原文:https://mp.weixin.qq.com/s/kU76kB6T1JSqapAfGPGRHQ,点击链接查看更多技术内容. 随着HarmonyOS 3.0 Beta版的发布,API Vers ...

  4. 动态规划(二)——背包dp

    01背包问题(每个物品最多选一次) AcWing 2. 0/1背包问题 朴素の版本: #include <bits/stdc++.h> using namespace std; const ...

  5. redis 简单整理——主从拓扑图[二十二]

    前言 Redis的复制拓扑结构可以支持单层或多层复制关系,根据拓扑复杂性 可以分为以下三种:一主一从.一主多从.树状主从结构,下面分别介绍. 正文 一主一从结构 一主一从结构是最简单的复制拓扑结构,用 ...

  6. 《C# in depth》第6章C#6.0中的更改(十四)——表达式体

    表达式体成员是一种在C# 6及以上版本中引入的语法.它允许开发人员使用Lambda表达式来简化方法或属性的定义. 在使用表达式体成员时,可以将方法或属性的实现写在一个Lambda表达式中,然后直接返回 ...

  7. resin报错:java.lang.IllegalStateException: block Block

    java.lang.IllegalStateException: block Block 启动resin时报错 主要的提示信息就是下面这个 java.lang.IllegalStateExceptio ...

  8. 力扣176(MySQL)-第二高的薪水(中等)

    题目: id 是这个表的主键.表的每一行包含员工的工资信息. 编写一个 SQL 查询,获取并返回 Employee 表中第二高的薪水 .如果不存在第二高的薪水,查询应该返回 null . 查询结果如下 ...

  9. 力扣26(java&python)-删除有序数组中的重复项(简单)

    题目: 给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度.元素的 相对顺序 应该保持 一致 . 由于在某些语言中不能改变数组的长 ...

  10. 【pytorch学习】之概率

    6 概率 简单地说,机器学习就是做出预测.根据病人的临床病史,我们可能想预测他们在下一年心脏病发作的概率.在飞机喷气发动机的异常检测中,我们想要评估一组发动机读数为正常运行情况的概率有多大.在强化学习 ...