日期:2014-05-17  浏览次数:21964 次

C# 处理大量数据时如何使用内存,报错OutOfMemory
     由于需求需要,要对采集的大量数据进行处理,最大能达到128000000,目前,我一直把数据存在一个一维数组中,程序运行的时候,启动采集数据,指不定什么时候,程序发生崩溃,一开始不知道是这个原因,调试了之后,发现每次处理数据的时候,data= new byte[128000000]的时候 就报错了,提示OutOfMemory错误,从此之后,每次都会弹出,使用完了,通过data = null来清空数据。数据通过一个DeviceConnect类中的采集方法,使用硬件设备提供的DLL,从内存中获取数据,然后使用注册事件,委托到UI上显示。
     还有其他不明的,请回帖问哦,谢谢大家的。

------解决方案--------------------
data = null
不代表清空,内存未必释放
看看是不是还有指针指向data没有释放

如果没有释放那么每次128M的申请肯定几次就挂了
通过任务管理器或是.NET Memory Profiler跟踪内存在哪里泄漏了
------解决方案--------------------
=null确实为了释放内存,但是否真正释放那还得看是不是已经没有任何一个引用指向该内存块了。只要还有一个,系统就不会释放内存。

我估计你多半是有什么地方引用了那些内存,且没给释放。
------解决方案--------------------
这个临时数组有多大?能够生存多久?要是没有限制的话,那它会一直保存着这些东西,直到系统罢工。

------解决方案--------------------
如果我没有数错鸡蛋的话,貌似那是1.28G,如果全部填充数据的话再转SHORT数组就再X2。32位应用程序貌似跑不到这么大的内存
------解决方案--------------------
那么你的程序是在还没有显示完数据就崩溃的?那表示你的算法不对,对内存提出了超过能力的需求。

如果是显示完成之后才崩溃的,那就表示你的程序没有成功释放空间。多半有别的地方还引用着这些变量,或者有什么变量被你定义成静态的了。

每次要128M空间,这个真有点过分了。按理说这么大规模的采集数据应该马上分析处理完,然后或删除或存储,不能再等下一批数据到达了。
------解决方案--------------------
设一个缓存区吧,采集到比如32M就写到硬盘,释放后再采集。虽然现在内存是大,我的习惯是能少用点就少用点。