当前位置: 代码迷 >> Sql Server >> adapter.Fill(,);引发OutOfMemoryException异常
  详细解决方案

adapter.Fill(,);引发OutOfMemoryException异常

热度:755   发布时间:2016-04-24 09:03:10.0
adapter.Fill(,);引发OutOfMemoryException错误

如图所示,其中命名为table3d的数据库表里有九百多万条数据。请问大能是什么原因导致的?是datatable虚拟表放不下那么多数据吗?怎么解决?
------解决思路----------------------
内存不够了吧。
别用select *,只把你需要的列选出来吧。
或者可能的话,处理完一个datatable,释放后,再处理下一个

------解决思路----------------------
你一次性取九百万条记录做什么?
程序不能这样处理数据。
------解决思路----------------------
900 多万, 分页吧、、、
------解决思路----------------------
引用:
每一行只有四列的九百多万也是很多吗?我是觉得把它全放到datatable里会好操作一些,头疼 

这不是好不好操作的问题,而是你为什么要把所有的明细都取过来。
既然所有的明细都程序处理,不利用数据库处理大数据的特性,就别用数据库了!
------解决思路----------------------
select * from mytable3d  limit 0, 100

这就是取数据库表从开始到第100条的数据.

第二页就是  select * from mytable3d  limit 101, 200

MYSQL 的分页, 很友爱的.


------解决思路----------------------
你要做什么处理?你到你要做的操作数据库不能执行?
数据库就是处理数据的,你不能在数据库中处理么?

------解决思路----------------------
用 C# 写 SQL CLR 插值函数。
存储过程用游标来遍历数据,存储过程中调用插值函数来计算当前的c、d。
------解决思路----------------------
直接写存储过程,在DB端执行,
900W数据,拉出来你的程序都差不多了。
------解决思路----------------------
引用:
Quote: 引用:

你要做什么处理?你到你要做的操作数据库不能执行?
数据库就是处理数据的,你不能在数据库中处理么?

表1                                     表2
时间     值a       值b           时间     值c         值d     
1           *               *              1          *               * 
2           *               *              3          *               * 
3           *               *              5          *               * 
4           *               *
根据一定算法通过插值把表2中缺失的时间和值c,d算出来,最后合成表3
表3
时间       值a      值b     值c    值d
1               *          *         *        *
2               *          *         *        *
3               *          *         *        *
4               *          *         *        *
5               *          *         *        *
过程是在c#中执行,调用数据库进行存放数据和使用数据库的数据操作,表的数据量非常大,大神请指教

这个直接在数据库处理就行了,不用使用其他处理手段。
------解决思路----------------------
无意打击,太欢乐了,900W拉到程序里面处理~~
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

你要做什么处理?你到你要做的操作数据库不能执行?
数据库就是处理数据的,你不能在数据库中处理么?

表1                                     表2
时间     值a       值b           时间     值c         值d     
1           *               *              1          *               * 
2           *               *              3          *               * 
3           *               *              5          *               * 
4           *               *
根据一定算法通过插值把表2中缺失的时间和值c,d算出来,最后合成表3
表3
时间       值a      值b     值c    值d
1               *          *         *        *
2               *          *         *        *
3               *          *         *        *
4               *          *         *        *
5               *          *         *        *
过程是在c#中执行,调用数据库进行存放数据和使用数据库的数据操作,表的数据量非常大,大神请指教

这个直接在数据库处理就行了,不用使用其他处理手段。

我现在是需要在c#里处理,不打开sql2008数据库,不在sql2008里做任何操作和写代码,全都是在c#里调用数据库


首先具体我不知道你需要最后的数据形式是如何的。如果可以用join读出你需要的数据,那你现在所有做的东西都是和尚买梳子。。。
看你程序,你起码也有权限在数据库表格进行读取,那就是说,你完全可以更改你的数据库代码,以获得最简洁的数据。

算了,不多说了,祝你好运吧。顺便说一下,就目前普通家用计算机32G左右的内存,执行你这样的程序,基本也会奔溃。
------解决思路----------------------
引用:
不打开sql2008,不在sql2008里做任何操作,我的建库建表导入数据都是在c#里写的

这种黑科技听都没听说过,不操作数据库还能操作数据
太高深了,召唤仙宫星人吧!
------解决思路----------------------
1,adapter.fill(table3d)那行报OOM不代表那个语句就是OOM的Root Cause (按照你900万4列来说的话,估计500M左右),你要检查一下前面2个tables是不是也很大?
2,如果前面2个table也很大,那就应该过滤后再来fill,就像前面很多兄弟说的那个用分页。
3,如果前面2个表的不大,但是当运行adapter.fill(table3d)的时候还是报错,那一般分两种情况。
    3.1, 其他的进程已经占用了比大的内存,所以当你程序申请500M的内存的时候就报错。
    3.2,其他的进程占用的并不大,而是你的C#的程序占用了比较大的内存,比如说你的物理内存为4G,你的C#程序占用了3  G,那么就要查询3G的被哪些对象占用的。这个应该不难吧, 手工抓个DUMP ,WINDBG+SOS ,然后一个dumpheap -statistics

从OOM 的角度来说,adapter.fill(table3d)那行并非是造成OOM的主因。
从程序设计的角度来说,一次性加载900W行绝对是有问题的。

------解决思路----------------------
一次看900多万条,你看得完吗?不用选这么多,内存不够用。
  相关解决方案