我必须从我的数据库中获取大量不同的记录(1000.000)才能根据此数据构建报告。我的数据库在远程系统上。现在我为每个报告都有不同的sql语句。这个sql语句被发送到服务。该服务填充DataSet并将其返回给我的应用程序。现在我可以将DataSet绑定到我的报告中。 问题是具有多个记录的DataSet具有巨大的内存消耗。我的意思是,如果我加载数据,一次加载时内存增加到1gb。
是否有替代方法可以在没有内存消耗的情况下加载数据? 我的意思是我已经像NHibernate一样使用ORM,但问题是我不知道将要加载的数据,有数百个报告具有可以更改的不同sql语句,因此我无法创建数百个要映射的类。 ..
编辑:
以下是我使用的示例代码:
DataSet dataSet = new DataSet();
try
{
using (FbConnection connection = new FbConnection(strConnString))
{
connection.Open();
using (FbCommand cmd =
new FbCommand(
"SELECT * FROM CUSTOMERS;",
connection))
{
FbDataAdapter fbd = new FbDataAdapter(cmd);
fbd.Fill(dataSet);
// This is what the default ADO.Net provider can do..
//SqlCommand command = new SqlCommand(queryString, connection);
//System.Xml.XmlReader reader = command.ExecuteXmlReader();
}
}
}
catch (Exception ex)
{
}
答案 0 :(得分:0)
你应该问的问题是:它有多少数据,什么是内存OVERHEAD。如果OVERHEAD很大,您需要找到更好的数据结构。如果DATA本身对于内存来说太大,则需要探索一次只将其中一部分带入内存的方法。
在任何一种情况下,使用NHibernate报告如此大的卷都是可疑的 - 使用现有的映射类来构造查询会很有用,但是必须包含对简单的未映射DTO类或对象[]的投影。类似的,以避免NHibernate为所有结果实例化映射类 - 后者对性能和内存消耗都不利。
哦,你的意思是你有一个返回DataSet的Web服务吗?这通常被认为是不好的样式,因为DataSet类是特定于Microsoft的,并且由于各种其他原因(http://www.hanselman.com/blog/ReturningDataSetsFromWebServicesIsTheSpawnOfSatanAndRepresentsAllThatIsTrulyEvilInTheWorld.aspx)。