【发布时间】:2012-07-23 15:03:23
【问题描述】:
在我们的应用程序中,我们使用 Windows 服务 生成报告。报告的数据是使用 存储过程 从 SQL Server 获取的。在某些情况下,返回的结果集包含 250,000 条记录(这部分我们无能为力,我们需要一次性使用这些数据,因为我们需要对此进行一些计算)。
问题
我们的应用程序正在读取器中获取此数据,并且我们正在将此数据集转换为自定义对象的自定义集合。由于数据巨大,它无法将完整的数据存储在自定义对象中,从而导致内存不足。当我们在执行记录时看到任务管理器的进程使用率,它会变得非常高,甚至是 CPU 使用率。
我不确定在这种情况下应该怎么做。
- 我们能否增加分配给在 CLR 下运行的单个进程的内存大小?
- 还有其他解决方法吗?
任何帮助将不胜感激
- 为什么我需要一次所有数据:我们需要对完整的结果集进行计算
- 我们正在使用 ADO.NET 并将数据集转换为我们的自定义对象(集合)
- 我们的系统是 32 位的
- 我们无法分页数据
- 无法将计算移至 sql server
此堆栈跟踪可能会有所帮助:
引发了“System.OutOfMemoryException”类型的异常。服务器 堆栈跟踪:在 System.Collections.Generic.Dictionary
2.ValueCollection.System.Collections.Generic.IEnumerable<TValue>.GetEnumerator() at System.Linq.Enumerable.WhereEnumerableIterator1.MoveNext() 在 System.Collections.Generic.List1.InsertRange(Int32 index, IEnumerable1 集合)在 System.Collections.Generic.List1.AddRange(IEnumerable1 集合) 在 MyProject.Common.Data.DataProperty.GetPropertiesForType(Type t) 中 C:\Ashish-Stuff\Projects\HCPA\Dev Branch\Common\Benefits.Common\Data\DataProperty.shared.cs:第 60 行 MyProject.Common.Data.Extensions.GetProperties[T](T target) in C:\Ashish-Stuff\Projects\HCPA\Dev Branch\Common\Benefits.Common\Data\Extensions.shared.cs:第 30 行 MyProject.Common.Data.Factories.SqlServerDataFactoryContract1.GetData(String procedureName, IDictionary2 参数,Nullable1 languageId, Nullable1 pageNumber,Nullable`1 pageSize)
谢谢, 阿什什
【问题讨论】:
-
您应该调查是否可以在 SQL 中进行部分或全部计算。例如,您可以将结果汇总到少于 250 万行,然后继续使用 C# 进行处理。
-
我们需要更多信息。例如操作系统是 32 位还是 64 位操作系统。 2,500,000 条记录不算什么,有些系统可以处理数十亿条记录,它们只是将它们分成片然后组合起来。至于我对这个问题投反对票的原因,您需要提供代码并向我们展示您目前如何处理该问题,以便我们解决您遇到的下划线问题。
-
可以分页数据吗?缓存呢?
-
根据计算的性质,您可能不需要一次将其全部加载到内存中(实际上您可以让 SQL Server 进行计算)。我怀疑除了从 32 位移动到 64 位之外,没有什么会增加您的进程的内存。至于解决方法,我们需要更多地了解您的数据结构以及您正在执行的计算。我认为使您要加载的对象尽可能小是不言而喻的(即只保存数据,没有其他内容)。
-
这是 250 * 1000 用印度数字分组写的 :)
标签: c# sql windows-services garbage-collection out-of-memory