当前位置:编程学习 > C#/ASP.NET >>

大数组初始化内存溢出问题

小弟最近在做一个关于遥感图像的软件,其中涉及到一个问题,导致了内存溢出,望大家不吝赐教。
1 处理的这个遥感图像非常大,一个遥感图像的文件包含几个波段。每一个波段都是一副图像。
2 在涉及到一个波段合成的时候,要将三个不同的波段图像分别作为R,G,B通道,从而合成一幅彩色图像。
3 用的是第三方的类库,开源的。跟踪发现,有两种方式:
① 一次取一个波段的图像数据,等用户自己选择三个波段后再合成一幅彩色图像,这样做能取出三个波段的图像数据并转换为三张图片,但是缺点是太慢了,在合成的时候发生异常(参数无效异常)。
② 一次全部取出所有波段的的数据,放在一个超大数组里面(类库中也提供了这个方法),但是在数组初始化时(给数组分配存储空间),即发生内存溢出异常。
4 通过查询,网上众说纷纭,主要有下面几种说法 
①内存里面本来有足够的空间,但是不连续,从而导致溢出。
②还有人说解决的方法是采用缓冲池(不懂)。
③采用内存数据库技术。
④将数据放在硬盘中然后再来读取(这样会不会太慢)。
等等
5 针对这一类的问题,有没有一个比较标准的方法,即处理大数据量的一般做法是什么呢?或者说是最优方法是什么呢?网上资料是很多,但是真心感觉不靠谱。
6 在处理这种大数据量的文件时,怎么才能提高速度呢?(注:没学过数据结构,正在啃这本书) --------------------编程问答-------------------- 数组是连续内存空间,分配过大数组很容易溢出,这个问题也很难解决,因为之前的分配容易产生碎片,导致.net找不到连续的空间,

解决方案,在前面处理中,没事经常调用GC.Colect回收垃圾,这样就可以剩余大片连续内存,

--------------------编程问答-------------------- 另一个终极解决方案是,把你的程序编译成64位版本,这样托管堆就会无限大,分配再多也不会溢出, --------------------编程问答-------------------- http://www.chinaz.com/program/2008/1124/46386_4.shtml --------------------编程问答--------------------
引用 1 楼 stonespace 的回复:
数组是连续内存空间,分配过大数组很容易溢出,这个问题也很难解决,因为之前的分配容易产生碎片,导致.net找不到连续的空间,

解决方案,在前面处理中,没事经常调用GC.Colect回收垃圾,这样就可以剩余大片连续内存,

不行,第一次打开是内存就溢出了 --------------------编程问答-------------------- 其他的不懂.不过NET4.5之前不支持大于2GB的数组,即使在64位平台上。
.NET4.5通过配置文件的gcAllowVeryLargeObjects元素可以在64位平台上启用大于2GB数组的支持。这个元素的默认值是false。
http://msdn.microsoft.com/zh-cn/library/hh285054.aspx --------------------编程问答--------------------
引用 5 楼 hhddzz 的回复:
其他的不懂.不过NET4.5之前不支持大于2GB的数组,即使在64位平台上。
.NET4.5通过配置文件的gcAllowVeryLargeObjects元素可以在64位平台上启用大于2GB数组的支持。这个元素的默认值是false。
http://msdn.microsoft.com/zh-cn/library/hh285054.aspx

在c#里怎么配置这个文件呢?我不会配置文件。我是.NET 4.0的 --------------------编程问答--------------------
Quote: 引用 3 楼 hdt 的回复:

http://www.chinaz.com/program/2008/1124/46386_4.shtml[/quote
看完了一头雾水,不太看得懂啊 --------------------编程问答--------------------
引用 6 楼 tangzijun158 的回复:
引用 5 楼 hhddzz 的回复:其他的不懂.不过NET4.5之前不支持大于2GB的数组,即使在64位平台上。
.NET4.5通过配置文件的gcAllowVeryLargeObjects元素可以在64位平台上启用大于2GB数组的支持。这个元素的默认值是false。 http://msdn.microsoft.com/zh-cn/library/hh285054.asp……

这个要.NET4.5才支持。

应用程序配置文件的话,就是一个名字为可执行文件的文件名名(包括扩展名)+".config"的xml文件,和可执行文件放在一起。你可以自己建这个文件,或者从vs的“添加新建项”里面添加,里面有应用程序配置文件。然后把下面的内容放进去。
<configuration>
  <runtime>
    <gcAllowVeryLargeObjects enabled="true" />
  </runtime>
</configuration>
这段代码上面的链接里有。configuration是配置文件的根元素,runtime是一个固定的子元素。 --------------------编程问答-------------------- http://bbs.csdn.net/topics/380124626
用缓冲池行不行啊?这个问题跟我的有些相似。 --------------------编程问答-------------------- 一定要用数组吗 --------------------编程问答-------------------- 多谢大家的回复,我找到了一个网址,可能会对以后类似的问题有帮助
http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/902ce33d-93c6-4f95-8814-6cdac9ae874b --------------------编程问答-------------------- 一个Int32结构表示的范围有多大?上限根本不到2G。

如果你一个数组中所有单元加起来的个数达到2G,就不应该使用普通的数组。例如你可以自己定义一个结构,这个结构是多个数组组成的,而它自身并不是数组。 --------------------编程问答-------------------- 通常使用现成的方法(但这跟编程没有直接关系)将你的模型减小规模,例如将一些矩阵分解并对分解的矩阵求解,甚至对稀疏矩阵(例如三角矩阵)采取省内存的数据结构,等等。

电脑也不是随便处理垃圾数据的地方,你需要选择规模比较小的算法来解算问题,而不是使用最为蛮力的简单算法。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,