我想选择我的表中有大约250万条记录的所有列。system.dll中的异常“System.OutOfMemoryException”
但它抛出我execution.How的一段时间后,上述的异常来解决这个问题
adapter.SelectCommand = new SqlCommand("SELECT * from Dwh_staging_table", con1);
adapter.Fill(DataSet2, "Transformed_Table");
我想选择我的表中有大约250万条记录的所有列。system.dll中的异常“System.OutOfMemoryException”
但它抛出我execution.How的一段时间后,上述的异常来解决这个问题
adapter.SelectCommand = new SqlCommand("SELECT * from Dwh_staging_table", con1);
adapter.Fill(DataSet2, "Transformed_Table");
我想你正在处理一些定制的数据仓库解决方案,这意味着大量的数据。无论您尝试做什么,都不应将数据库中的所有数据加载到应用程序中,以便计算暂存表中的某些数字。
您可以做的最好的事情就是在将数据放入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]
分页与sql查询或c#有关,我对这个概念很陌生。 – user1056466
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
谢谢你链接帮助我.... :) – user1056466
答案显然是减少返回的数据集。你需要所有的列?
如何分页数据?查看row_number()函数。
如何减少返回的数据集? – user1056466
您正在通过执行“select * ...”选择* all *列。如果你不需要所有的列,只需在select语句中指定你需要的列。尽管如此,我们正在谈论的是你正试图适应内存的2.5万记录。通过使用row_number()函数,你可以将它分成批次,首先获得前1000行,然后是下1000个。 – HaukurHaf
使用自定义Paging.Fetch仅限于记录在一个时间
整个数据是大的允许应用程序分配内存。也许你可以通过逐行读取来解决问题,而不是一次加载所有的行。你真的需要加载你的表的所有列吗? – sjkm
你可以在数据库管理工具中执行相同的查询吗? – will
也许只是部分加载您的数据 –