从数据库到代码的大型未知数据
我必须从我的数据库获取大量不同的记录(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)
{
}
你应该问的问题是:有多少数据是,什么是内存开销。如果OVERHEAD很大,则需要找到一个更好的数据结构。如果DATA本身对于内存太大,则需要探索一次只将其中一部分带入内存的方法。
在这两种情况下,使用NHibernate报告这样大的卷是令人怀疑的 - 使用现有的映射类来构造查询可能是有用的,但是您必须包括投影到简单的未映射DTO类或对象[]或类似的,以避免NHibernate为所有结果实例化映射类 - 后者对性能和内存消耗都不利。
哦,你是不是说你有一个Web服务返回一个DataSet?一般来说,这被认为是不好的风格,因为DataSet类是特定于Microsoft的,并且出于各种其他原因(http://www.hanselman.com/blog/ReturningDataSetsFromWebServicesIsTheSpawnOfSatanAndRepresentsAllThatIsTrulyEvilInTheWorld.aspx)。
该web服务仅供我的应用程序使用。我必须从数据库加载数据,并且DataSet是实现它的唯一方法,按照我使用的firebird和ADO.Net提供程序的方式。如果我将DataSet解析为XML或Json或其他内容,则会出现额外的性能问题。我的意思是,如果有可能直接将数据加载到XML中,那会更好,但目前为止还没有发现。唯一的方法是将其加载到DataSet中,然后将其写入XML。 oroginal SQLCommand类具有类似于ExecuteXmlReader()的东西,但没有任何此类Firebird提供者(FBCommand)。 – Franki1986
这里有些东西...... ADO.Net的基本返回结构是* DataReader *,而不是DataSet。虽然框架提供了将DataReader读入DataSet的方便方法,但据我所知,这是ADO.Net的用户必须明确执行的。 –
我放了一些代码来解释我的意思。 – Franki1986