使用实体框架是否会对内存施加很大压力,就像DataSet一样?

时间:2009-07-28 03:47:53

标签: entity-framework ado.net

我是实体框架的新手。某些屏幕强制转换I've been watching,会显示结果集在内存中的变化。这似乎可以使用大量内存。

这是否意味着EF不适合ASP.NET开发?实体框架是否具有类似于SqlDataReader的内存有效模式?

3 个答案:

答案 0 :(得分:3)

看起来如果通过查询结果枚举为对象,实际使用了DbDataReader并且动态创建了对象,因此只有1行将作为实际的EntityObject存储在内存中。您也可以使用EntityClient Provider在DataReader级别访问数据,但如果您担心最佳性能,我认为您应该坚持使用普通的ADO.NET。

我在相当高流量的网站上使用了Entity Framework而没有内存或性能问题(每天12,000 - 20,000个唯一身份访问者,浏览量为250k)。

此外,您可能希望等待Entity Framework 4.0,或使用预发布版。它有很多改进,其中一个是对POCO(普通旧CLR对象)的支持。

答案 1 :(得分:2)

“实体框架是否具有类似于SqlDataReader的内存高效模式?”

不,EF在RAM中制作对象的完整副本,类似于DataSet和DataRelations等,但它将它们保存在对象中。然后它还必须保留每个对象的副本更改(Changesets)。然后,如果您提交更改,则每个更改都将构建为SQL以更新数据库。

SqlDataReader是一个只向前轻量级的阅读器,可以一次抓取一行。 EF会将您对查询的所有答案加载到对象集合中,并在其上方进行更改跟踪。

它适合您的应用吗?我不知道。如果您需要尽可能快的RAM和最少量的RAM,那么ADO.NET是唯一的出路。放在ADO.NET之上的任何抽象都会增加开销,内存等。

答案 2 :(得分:1)

EF将使用比直接使用ADO.net更多的内存(假设您正确使用ADO.net)

话虽如此,我们在没有内存问题的大型ASP.net项目中使用了EF。

我能想到的唯一情况是,如果你正在处理大型二进制对象,并且想要流式传输而不是将它们加载到内存中。