2013-11-24 25 views
1

我想选择我的表中有大约250万条记录的所有列。system.dll中的异常“System.OutOfMemoryException”

但它抛出我execution.How的一段时间后,上述的异常来解决这个问题

adapter.SelectCommand = new SqlCommand("SELECT * from Dwh_staging_table", con1); 
adapter.Fill(DataSet2, "Transformed_Table"); 
+2

整个数据是大的允许应用程序分配内存。也许你可以通过逐行读取来解决问题,而不是一次加载所有的行。你真的需要加载你的表的所有列吗? – sjkm

+0

你可以在数据库管理工具中执行相同的查询吗? – will

+0

也许只是部分加载您的数据 –

回答

2

我想你正在处理一些定制的数据仓库解决方案,这意味着大量的数据。无论您尝试做什么,都不应将数据库中的所有数据加载到应用程序中,以便计算暂存表中的某些数字。

您可以做的最好的事情就是在将数据放入Dwh_staging_table之前计算所需的任何内容,以便在发生问题之前解决问题。如果这是不可能的,并且您已经将数据加载到数据库中,则应该在数据库中执行所有处理(例如,使用讨厌的存储过程)。

一般来说,当你处理大量数据时,移动数据是你最大的敌人。尝试在现在数据所在的位置解决所有问题,而不必进行不必要的转移。

如果你想反正把数据加载回c#代码(我不建议这么做),试着去做所有的事情,而不是实现内存中的所有数据。创建存储库函数返回IEnumerable,这将在内部使用yield return,因此整个数据集合都不会实现。

如果你仍然坚持在某些集合中实现数据(我甚至不建议更多),请查看一些没有使用连续内存块的集合。使用像数组,List或DataSet这样的集合会导致出现内存异常的机会增加。尝试使用像LinkedList之类的东西,或者更好地使用某些分块的LinkedList数组(几乎就像其他帖子中提到的分页)。

编辑: 从你说的话

我在表中的一些缺失值,我想以后填补一些列使用平均techninque

它的声音,我喜欢的东西数据库中临时表的一条UPDATE语句应该可能。不知道您想要的是什么(例如,我想将“Metric”列的AvgMetric平均值设置为“按类别”列分组)。在这种情况下,它看起来像:

WITH t AS (
SELECT st.[Category] 
     ,st.[AvgMetric] 
     ,AVG(st.[Metric]) OVER (PARTITION BY [st.Category] AS [CalculatedAvgMetric] 
    FROM [Dwh_staging_table] st 
) 
UPDATE t 
    SET [AvgMetric] = [CalculatedAvgMetric] 
+0

分页与sql查询或c#有关,我对这个概念很陌生。 – user1056466

+1

HaurkurHaf建议使用row_number()对SQL查询级别进行分页(http://beyondrelational.com/modules/2/blogs/28/posts/10434/sql-server-server-side-paging-with-rownumber-function的.aspx)。好处是您只需将小块数据加载到内存中。缺点是你会针对数据库执行多个查询。 我的建议是在处理流中的所有数据时打开连接并保持打开状态。使用LinkedList(或列表的LinkedList)是如果你想把所有内容都放在内存中。 – Tiny

+0

谢谢你链接帮助我.... :) – user1056466

0

答案显然是减少返回的数据集。你需要所有的列?

如何分页数据?查看row_number()函数。

+0

如何减少返回的数据集? – user1056466

+0

您正在通过执行“select * ...”选择* all *列。如果你不需要所有的列,只需在select语句中指定你需要的列。尽管如此,我们正在谈论的是你正试图适应内存的2.5万记录。通过使用row_number()函数,你可以将它分成批次,首先获得前1000行,然后是下1000个。 – HaukurHaf

0

使用自定义Paging.Fetch仅限于记录在一个时间

相关问题