asp 循环读取数据库库的一条记录,内存越来越大怎么办

2017年2月 总版技术专家分月排行榜第三
2017年4月 .NET技术大版内专家分月排行榜第一2017年3月 .NET技术大版内专家分月排行榜第一2017年2月 .NET技术大版内专家分月排行榜第一2016年10月 .NET技术大版内专家分月排行榜第一2016年8月 .NET技术大版内专家分月排行榜第一2016年7月 .NET技术大版内专家分月排行榜第一
2017年2月 总版技术专家分月排行榜第三
2017年4月 .NET技术大版内专家分月排行榜第一2017年3月 .NET技术大版内专家分月排行榜第一2017年2月 .NET技术大版内专家分月排行榜第一2016年10月 .NET技术大版内专家分月排行榜第一2016年8月 .NET技术大版内专家分月排行榜第一2016年7月 .NET技术大版内专家分月排行榜第一
2017年2月 总版技术专家分月排行榜第三
2017年4月 .NET技术大版内专家分月排行榜第一2017年3月 .NET技术大版内专家分月排行榜第一2017年2月 .NET技术大版内专家分月排行榜第一2016年10月 .NET技术大版内专家分月排行榜第一2016年8月 .NET技术大版内专家分月排行榜第一2016年7月 .NET技术大版内专家分月排行榜第一
本帖子已过去太久远了,不再提供回复功能。循环读取数据库的一条记录,内存越来越大怎么办。
两个进程,进程a不停的更改数据库里的一条记录。
进程b&0.5秒读取一次这条记录,达到更新显示的目的。
searchAd&s&=&new&&searchAd();
&private&void&timer2_Tick(object&sender,&EventArgs&e)
{&&&&&&&&&&&
&&&&DataSet&dt&=&s.serachAdValue();
&&&&if&(dt&==&null&||&dt.Rows.Count&==&0)
&&&&&&&&&&MessageBox.Show("没有你所要查询的数据");
&&&&&&&&&else
&&&&&&&&&&{
&&&&&&&&&&&&&&赋值显示
&&&&&&&&&&&}&&&&&&&&
&&&&dt.Dispose();&
searchAd是另写的一个有连接字符串和sql语句的类。
打开任务管理器,发现调试的进程占用内存越来越大。
应该是连接没有处理好,searchAd类才是问题所在
可以不用周期性读数据库,
数据量少的情况下可以使用触发器,
将变更数据写到文件中去&
读进程读文件就可以
引用&1&楼&xian_wwq&的回复:应该是连接没有处理好,searchAd类才是问题所在
可以不用周期性读数据库,
数据量少的情况下可以使用触发器,
将变更数据写到文件中去&
读进程读文件就可以
。但是new类实例只有一次执行啊。
想想改改构架,弄个一个进程里,多开几个线程算了。
还是多进程用共享内存快点。
把&timer2_Tick&中的代码注释掉&,运行看看,如果内存不增加&那就是DataSet&没有释放完全。
感觉没有关闭数据库链接
没有实测:感觉可能是使用后的变量、连接&没有及时清理
在不断的创建连接对象吧?
用.Net&Memory&Profiler监控一下就可以看到了,如果代码不复杂,还是看看有什么对象是不断的New但是&没有释放的。
你把代码这样放出来,看不出来什么,只能说明你的数据库访问类写的有问题。
你这样做的话,就用dataread读取数据,他是每次从数据库读取一条数据,并且一直占用数据库连接。
引用&2&楼&cs1438250&的回复:Quote: 引用&1&楼&xian_wwq&的回复:
应该是连接没有处理好,searchAd类才是问题所在
可以不用周期性读数据库,
数据量少的情况下可以使用触发器,
将变更数据写到文件中去&
读进程读文件就可以
。但是new类实例只有一次执行啊。
想想改改构架,弄个一个进程里,多开几个线程算了。
还是多进程用共享内存快点。
&DataSet&dt&=&s.serachAdValue();
这个是每次都实例化的,Dispose也不能保证dt被释放,另外,这种情景应考虑消息机制,而不是去轮询
即使是一小步也想与你分享6595人阅读
C#/Java(11)
本来是个帖子,但是问的问题没有得到实际的答案。所以干脆放到Blog上来好了,当作长期的一个题目。这样如果有人看的话,也许能够给我一些线索。我用C#做数据库应用的时候,经常遇到的一个问题就是内存消耗特别大。这种情况在作大数据量的数据库导入导出的时候更为明显。说一个常见的数据库导入导出的Case, 大家看看比较合理的办法是什么:环境:有一个数据库SRC, 里面有500万条记录。有A, B, C三个字段。数据库的大小去掉水分后,大约500MB的数量级。这个作为源数据库。数据库DEST是目标数据库,里面有AA, BB, CC, DD, EE, FF等5个字段。其中,AA, BB, CC的值,是根据SRC.A和B的值计算得来的。而且过程复杂,所以不适合使用存储过程实现。并且AA, BB, CC不是单独得出,而是同时以SRC.A和SRC.B得出的(当然,运算三遍可以分别取到各值,但显然运算量就大了3倍)。目的:将SRC中的所有数据经过变换,导入到数据库DEST中。我所尝试过的方法:1. 最开始用最简单的DataAdapter.Fill(DataTable)的办法。然后foreach(DataRow rowsrc in dtSrc){&&& DataRow row = dtDest.NewRow();&&& ....&&& dtDest.Rows.Add(row);}daDest.Update(dtDest);dtDest.AcceptChanges();这明显不是处理大数据量迁移的办法。最明显的问题是内存消耗极大。500MB的数据库表变成DataSet中的DataTable,体积括大了很多。再加上dtDest中的拷贝,还有daDest.Update所占用的资源,很容易就超过了2GB的应用程序内存地址空间,而报错退出了。2. 我尝试用DataReader读入数据,然后写进dtDestusing( ... reader = ...){&&& while(reader.Read()){&&& &&& DataRow row = dtDest.NewRow();&&& &&& ....&&& &&& dtDest.Rows.Add(row);&&& }}daDest.Update(dtDest);dtDest.AcceptChanges();内存占用少了很多,因为SRC读入DataReader的数据,似乎会因为之后不用了,而有所释放。但是已经进入dtDest的数据没有必要存储在内存中的道理。可是又没有办法。即使daDest.Update和dtDest.AcceptChanges()后,它依然占用这内存。因此将daDest.Update和dtDest.AcceptChanges()放入循环内,并不能对内存使用有所改善。3. 纯SQL语句。不用DataTable用SqlCommand.ExecuteNonQuery()的来执行&Insert Into ...&的SQL语句。这样作后,发现内存占用大大降低了。起到了想达到的&管道&的效果。可是最之而来的确实更严重的问题。这样做的磁盘空间占用极大。数据库会产生大量的日志,和废弃空间。以Access为例,程序运行一段时间后,就超过了2GB最大文件的限制。当执行&压缩和恢复数据库&后,只有100MB左右。可见产生的数据垃圾多大。当然,采用SQL Server会没有2GB的限制,但是这么大量的日志和废弃空间,绝对不是一个适合的结果。而且,如果安这种比例,一个500MB的数据库,将占用超过10GB的存储空间,这是一个太大的浪费了。当然事后可以压缩,但是处理过程中的空间浪费不容忽视。4. 不输出到数据库,以CSV输出到文本文件这是个办法,至少一来不占用什么内存,二来,也没有浪费硬盘空间。但是麻烦的是,丢失了最重要的类型信息。对于字符串和数字还好说,最多就是字符串没有了长度,数字没有了精度,但都还能够保存下来。比较麻烦的是有些复杂类型,比如IMAGE, Binary,和GUID等,这种字节流形式的类型是没有办法报存在CSV中的。5.导出到XML当然用XML好一些,但是其Binary存储的Parse也是很耗费资源的,而且,用XML如何才能导入到数据库中呢?用C#就又回到老路上来了。SQL Server支持XML,但是其他的数据库呢?例如Access? 毕竟不是所有人都买的起SQL Server或者所有场合都适于使用SQL Server的。对于这个问题大家有什么好办法么?我觉得操作大一点的数据库的时候,内存占用是个很明显的问题。也许有很简单的方法我没有考虑到而走了很多弯路。谢谢了。---CCNA/http://blog.csdn.net/dancefire/MSN: @263.netI am interested in Operating System, Embedded System and Network Security.
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:358020次
积分:4590
积分:4590
排名:第5681名
原创:43篇
评论:528条
(1)(2)(3)(2)(3)(3)(3)(3)(3)(2)(6)(1)(2)(13)
() () () () () () () () ()2013年5月 总版技术专家分月排行榜第一
2016年7月 总版技术专家分月排行榜第二2016年3月 总版技术专家分月排行榜第二2015年12月 总版技术专家分月排行榜第二2014年8月 总版技术专家分月排行榜第二2014年7月 总版技术专家分月排行榜第二2013年6月 总版技术专家分月排行榜第二
2013年5月 总版技术专家分月排行榜第一
2016年7月 总版技术专家分月排行榜第二2016年3月 总版技术专家分月排行榜第二2015年12月 总版技术专家分月排行榜第二2014年8月 总版技术专家分月排行榜第二2014年7月 总版技术专家分月排行榜第二2013年6月 总版技术专家分月排行榜第二
2010年8月 PHP大版内专家分月排行榜第二
2010年7月 PHP大版内专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。一次读取大数据占用内存很大 - LabVIEW论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
一次读取大数据占用内存很大
09:40:29  
本帖最后由 elecfans跑堂 于
10:50 编辑
在编写一个读取wav文件的程序,发现一次读取40M以上的文件,消耗内存1G左右,太吓人了,请高手指点啊
这里是一个用C#的兄弟的疑问,我可以这样认为吗?什么语言编写的程序,一次处理大数据都会遇到内存不足问题,请问有知道解决办法的吗?不胜感激啊啊啊啊。
00:29:44  
PCB在线计价下单
板子大小:
板子数量:
PCB 在线计价
在读取数据的时候会有for循环或者while循环读取的,循环里面加一个1ms的延时,这样程序不会完全占用系统资源。
10:18:00  
不更换硬件就将数据分开处理,写个算法解决吧。
11:26:04  
没有见过。。。。。。。。。
10:00:58  
在读取数据的时候会有for循环或者while循环读取的,循环里面加一个1ms的延时,这样程序不会完全占用系统资源。
这样减少的是占用cpu的时间,但是内存问题还是没多大改变,一次读取1千万个数据进行显示,好晕,内存占的太大了。
11:03:01  
FreeMem.dll 调用这个dll可以释放内存
22:11:22  
FreeMem.dll 调用这个dll可以释放内存
采集数据的时候,while循环每循环一次就调用一次FreeMem.dll会有什么问题吗,会不会因为每次都调用而产生额外的开销什么的
17个问题&&&&&&&&7749个浏览
20个问题&&&&&&&&5394个浏览
CellWise周军
21个问题&&&&&&&&6543个浏览
Powered by}

我要回帖

更多关于 微信占用内存越来越大 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信