• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

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

tangzijun158 2012-11-23 06:11:48
小弟最近在做一个关于遥感图像的软件,其中涉及到一个问题,导致了内存溢出,望大家不吝赐教。
1 处理的这个遥感图像非常大,一个遥感图像的文件包含几个波段。每一个波段都是一副图像。
2 在涉及到一个波段合成的时候,要将三个不同的波段图像分别作为R,G,B通道,从而合成一幅彩色图像。
3 用的是第三方的类库,开源的。跟踪发现,有两种方式:
① 一次取一个波段的图像数据,等用户自己选择三个波段后再合成一幅彩色图像,这样做能取出三个波段的图像数据并转换为三张图片,但是缺点是太慢了,在合成的时候发生异常(参数无效异常)。
② 一次全部取出所有波段的的数据,放在一个超大数组里面(类库中也提供了这个方法),但是在数组初始化时(给数组分配存储空间),即发生内存溢出异常。
4 通过查询,网上众说纷纭,主要有下面几种说法
①内存里面本来有足够的空间,但是不连续,从而导致溢出。
②还有人说解决的方法是采用缓冲池(不懂)。
③采用内存数据库技术。
④将数据放在硬盘中然后再来读取(这样会不会太慢)。
等等
5 针对这一类的问题,有没有一个比较标准的方法,即处理大数据量的一般做法是什么呢?或者说是最优方法是什么呢?网上资料是很多,但是真心感觉不靠谱。
6 在处理这种大数据量的文件时,怎么才能提高速度呢?(注:没学过数据结构,正在啃这本书)
...全文
329 点赞 收藏 13
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
EEELab 2012-11-24
一定要用数组吗
回复
通常使用现成的方法(但这跟编程没有直接关系)将你的模型减小规模,例如将一些矩阵分解并对分解的矩阵求解,甚至对稀疏矩阵(例如三角矩阵)采取省内存的数据结构,等等。 电脑也不是随便处理垃圾数据的地方,你需要选择规模比较小的算法来解算问题,而不是使用最为蛮力的简单算法。
回复
一个Int32结构表示的范围有多大?上限根本不到2G。 如果你一个数组中所有单元加起来的个数达到2G,就不应该使用普通的数组。例如你可以自己定义一个结构,这个结构是多个数组组成的,而它自身并不是数组。
回复
tangzijun158 2012-11-24
多谢大家的回复,我找到了一个网址,可能会对以后类似的问题有帮助 http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/902ce33d-93c6-4f95-8814-6cdac9ae874b
回复
tangzijun158 2012-11-23
http://bbs.csdn.net/topics/380124626 用缓冲池行不行啊?这个问题跟我的有些相似。
回复
hhddzz 2012-11-23
引用 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是一个固定的子元素。
回复
tangzijun158 2012-11-23
[quote=引用 3 楼 hdt 的回复:] http://www.chinaz.com/program/2008/1124/46386_4.shtml[/quote 看完了一头雾水,不太看得懂啊
回复
tangzijun158 2012-11-23
引用 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的
回复
hhddzz 2012-11-23
其他的不懂.不过NET4.5之前不支持大于2GB的数组,即使在64位平台上。 .NET4.5通过配置文件的gcAllowVeryLargeObjects元素可以在64位平台上启用大于2GB数组的支持。这个元素的默认值是false。 http://msdn.microsoft.com/zh-cn/library/hh285054.aspx
回复
tangzijun158 2012-11-23
引用 1 楼 stonespace 的回复:
数组是连续内存空间,分配过大数组很容易溢出,这个问题也很难解决,因为之前的分配容易产生碎片,导致.net找不到连续的空间, 解决方案,在前面处理中,没事经常调用GC.Colect回收垃圾,这样就可以剩余大片连续内存,
不行,第一次打开是内存就溢出了
回复
http://www.chinaz.com/program/2008/1124/46386_4.shtml
回复
stonespace 2012-11-23
另一个终极解决方案是,把你的程序编译成64位版本,这样托管堆就会无限大,分配再多也不会溢出,
回复
stonespace 2012-11-23
数组是连续内存空间,分配过大数组很容易溢出,这个问题也很难解决,因为之前的分配容易产生碎片,导致.net找不到连续的空间, 解决方案,在前面处理中,没事经常调用GC.Colect回收垃圾,这样就可以剩余大片连续内存,
回复
相关推荐
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2012-11-23 06:11
社区公告

让您成为最强悍的C#开发者