[英]Working with a large amount of data
我以ORM身份获得了c#应用和entity famework
。 我有带有表Images
数据库。 表具有Id
, TimeStamp
, Data
列。 该表可以包含很多实体。 另外, Data
列包含大字节数组。 我需要以某个日期开始的第一个实体为例,或者以前5个为例。
var result = Images.OrderBy(img => img.TimeStamp).FirstOrDefault(img => img.TimeStamp > someDate);
抛出内存不足异常。 有什么办法可以通过吗? 我应该使用存储过程还是其他?
如果Images
已经是一个查询对象,则在您按OrderBy
对其进行访问时,它将访问整个集合。 我假设它不是,它直接是您的DbSet
或EF IQueryable
(因此您使用Linq-To-Entities而不是Linq-To-Objects进行查询,并且对数据库的查询已完成排序,并且不在返回的整个集合上)。
除非需要更改跟踪检测,否则请在AsNoTracking
上使用AsNoTracking
(在这种情况下为Context.Images.AsNoTracking().OrderBy(...)
,这将DbSet
降低内存需求(更改跟踪检测需要两倍的内存Context.Images.AsNoTracking().OrderBy(...)
。记忆)。
另外,如果使用大的Blob数据,将其存储在自己的表中(仅包含一个id
和data
)并仅在需要时访问它(在您要在其上的表/实体上引用此id
)可能是明智的(如果您正在执行操作),如果您正在使用ORM并希望一直使用原始实体(也可以使用Select
将查询投影到没有blob字段的新实体上)。
如果您需要一直访问返回的行的图像数据,而系统中没有足够的存储空间,那么运气不好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.