C# 处理大量数据时如何使用内存,报错OutOfMemory

xiaoqiang5448 2012-03-04 09:38:35
由于需求需要,要对采集的大量数据进行处理,最大能达到128000000,目前,我一直把数据存在一个一维数组中,程序运行的时候,启动采集数据,指不定什么时候,程序发生崩溃,一开始不知道是这个原因,调试了之后,发现每次处理数据的时候,data= new byte[128000000]的时候 就报错了,提示OutOfMemory错误,从此之后,每次都会弹出,使用完了,通过data = null来清空数据。数据通过一个DeviceConnect类中的采集方法,使用硬件设备提供的DLL,从内存中获取数据,然后使用注册事件,委托到UI上显示。
还有其他不明的,请回帖问哦,谢谢大家的。
...全文
1019 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
iihero_ 2013-11-08
  • 打赏
  • 举报
回复
这个,显然使用内存映射文件是最佳处理方案.
一只熊猫 2012-03-06
  • 打赏
  • 举报
回复
设一个缓存区吧,采集到比如32M就写到硬盘,释放后再采集。虽然现在内存是大,我的习惯是能少用点就少用点。
dulei123321 2012-03-06
  • 打赏
  • 举报
回复
using()
muyi66 2012-03-06
  • 打赏
  • 举报
回复
那么你的程序是在还没有显示完数据就崩溃的?那表示你的算法不对,对内存提出了超过能力的需求。

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

每次要128M空间,这个真有点过分了。按理说这么大规模的采集数据应该马上分析处理完,然后或删除或存储,不能再等下一批数据到达了。
Castiel丶Luo 2012-03-06
  • 打赏
  • 举报
回复
using()
muyi66 2012-03-06
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 xiaoqiang5448 的回复:]

还没显示,还在处理数据的时候 就崩溃了。
引用 16 楼 muyi66 的回复:
那么你的程序是在还没有显示完数据就崩溃的?那表示你的算法不对,对内存提出了超过能力的需求。

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

每次要128M空间,这个真有点过分了。按理说这么大规模的采集数据应该马上分析处……
[/Quote]改进算法吧,你的系统接受不了这么多数据。
xiaoqiang5448 2012-03-06
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 dulei123321 的回复:]
using()
[/Quote]
将处理数据放在using里面?
xiaoqiang5448 2012-03-06
  • 打赏
  • 举报
回复
还没显示,还在处理数据的时候 就崩溃了。
[Quote=引用 16 楼 muyi66 的回复:]
那么你的程序是在还没有显示完数据就崩溃的?那表示你的算法不对,对内存提出了超过能力的需求。

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

每次要128M空间,这个真有点过分了。按理说这么大规模的采集数据应该马上分析处理完,然后或删除或存储,不能再等下一批数据到达了。
[/Quote]
xiaoqiang5448 2012-03-06
  • 打赏
  • 举报
回复
是128MB[Quote=引用 11 楼 viewstates 的回复:]
如果我没有数错鸡蛋的话,貌似那是1.28G,如果全部填充数据的话再转SHORT数组就再X2。32位应用程序貌似跑不到这么大的内存
[/Quote]
xiaoqiang5448 2012-03-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 muyi66 的回复:]
这个临时数组有多大?能够生存多久?要是没有限制的话,那它会一直保存着这些东西,直到系统罢工。
[/Quote]跟data一样大,显示完数据就退出的。
buyong 2012-03-05
  • 打赏
  • 举报
回复
可以使用 System.GC.Collect() 来回收
PaulyJiang 2012-03-05
  • 打赏
  • 举报
回复
可以的时候自己手动释放内存还是不错的
nonocast 2012-03-05
  • 打赏
  • 举报
回复
data = null
不代表清空,内存未必释放
看看是不是还有指针指向data没有释放

如果没有释放那么每次128M的申请肯定几次就挂了
通过任务管理器或是.NET Memory Profiler跟踪内存在哪里泄漏了
muyi66 2012-03-05
  • 打赏
  • 举报
回复
是128M,不过多来几十次也受不了
ViewStates 2012-03-05
  • 打赏
  • 举报
回复
如果我没有数错鸡蛋的话,貌似那是1.28G,如果全部填充数据的话再转SHORT数组就再X2。32位应用程序貌似跑不到这么大的内存
muyi66 2012-03-05
  • 打赏
  • 举报
回复
这个临时数组有多大?能够生存多久?要是没有限制的话,那它会一直保存着这些东西,直到系统罢工。
xiaoqiang5448 2012-03-05
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 muyi66 的回复:]
=null确实为了释放内存,但是否真正释放那还得看是不是已经没有任何一个引用指向该内存块了。只要还有一个,系统就不会释放内存。

我估计你多半是有什么地方引用了那些内存,且没给释放。
[/Quote]
我在数据采集类里面声明一个事件
public delegate void ShowRealDataHandle(byte[] Data, int[] headData);
public event ShowRealDataHandle ShowRealData;
在UI类里面注册这个事件,当采集到数据的时候
if (ShowRealData != null)
ShowRealData(Data, headData);
并显示这个数据,因为数据类型的问题,我需要将数据从byte[] 转为short[],所以在UI显示数据的方法里面有一个临时数组储存从byte转为short的数据,就出现了上面的问题。程序提示outofmemory
muyi66 2012-03-05
  • 打赏
  • 举报
回复
=null确实为了释放内存,但是否真正释放那还得看是不是已经没有任何一个引用指向该内存块了。只要还有一个,系统就不会释放内存。

我估计你多半是有什么地方引用了那些内存,且没给释放。
xiaoqiang5448 2012-03-05
  • 打赏
  • 举报
回复
顶顶,顶顶,以前的程序也没出现过这种问题,前面的byte[] data是全局变量,没有其他引用,只是通过事件,来传递给了注册这个事件里面进行了数据显示。

当收到第二条数据的时候,我直接将data= new byte[128000000];
xiaoqiang5448 2012-03-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 buyong 的回复:]
可以使用 System.GC.Collect() 来回收
[/Quote]

这个啊,没用,我试过了。
加载更多回复(2)

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

试试用AI创作助手写篇文章吧