大数组初始化内存溢出问题
小弟最近在做一个关于遥感图像的软件,其中涉及到一个问题,导致了内存溢出,望大家不吝赐教。
1 处理的这个遥感图像非常大,一个遥感图像的文件包含几个波段。每一个波段都是一副图像。
2 在涉及到一个波段合成的时候,要将三个不同的波段图像分别作为R,G,B通道,从而合成一幅彩色图像。
3 用的是第三方的类库,开源的。跟踪发现,有两种方式:
① 一次取一个波段的图像数据,等用户自己选择三个波段后再合成一幅彩色图像,这样做能取出三个波段的图像数据并转换为三张图片,但是缺点是太慢了,在合成的时候发生异常(参数无效异常)。
② 一次全部取出所有波段的的数据,放在一个超大数组里面(类库中也提供了这个方法),但是在数组初始化时(给数组分配存储空间),即发生内存溢出异常。
4 通过查询,网上众说纷纭,主要有下面几种说法
①内存里面本来有足够的空间,但是不连续,从而导致溢出。
②还有人说解决的方法是采用缓冲池(不懂)。
③采用内存数据库技术。
④将数据放在硬盘中然后再来读取(这样会不会太慢)。
等等
5 针对这一类的问题,有没有一个比较标准的方法,即处理大数据量的一般做法是什么呢?或者说是最优方法是什么呢?网上资料是很多,但是真心感觉不靠谱。
6 在处理这种大数据量的文件时,怎么才能提高速度呢?(注:没学过数据结构,正在啃这本书)
--------------------编程问答--------------------
数组是连续内存空间,分配过大数组很容易溢出,这个问题也很难解决,因为之前的分配容易产生碎片,导致.net找不到连续的空间,
解决方案,在前面处理中,没事经常调用GC.Colect回收垃圾,这样就可以剩余大片连续内存,
--------------------编程问答--------------------
另一个终极解决方案是,把你的程序编译成64位版本,这样托管堆就会无限大,分配再多也不会溢出,
--------------------编程问答--------------------
http://www.chinaz.com/program/2008/1124/46386_4.shtml
--------------------编程问答--------------------
不行,第一次打开是内存就溢出了
--------------------编程问答--------------------
其他的不懂.不过NET4.5之前不支持大于2GB的数组,即使在64位平台上。
.NET4.5通过配置文件的gcAllowVeryLargeObjects元素可以在64位平台上启用大于2GB数组的支持。这个元素的默认值是false。
http://msdn.microsoft.com/zh-cn/library/hh285054.aspx
--------------------编程问答--------------------
在c#里怎么配置这个文件呢?我不会配置文件。我是.NET 4.0的
--------------------编程问答--------------------