处理大量数据
Working with a large amount of data
我得到了 c# appliaction 和 entity famework
作为 ORM。
我用 table Images
得到了数据库。 Table 有 Id
、TimeStamp
、Data
列。
这个 table 可以有很多实体。此外 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 进行查询,并且排序已完成在对数据库的查询上,而不是在返回的整个集合上)。
除非您需要更改跟踪检测,否则请在您的 DbSet
上使用 AsNoTracking
(在本例中为 Context.Images.AsNoTracking().OrderBy(...)
。这会大大降低内存需求(更改跟踪检测需要内存的两倍多)。
此外,如果使用大型 blob 数据,明智的做法是将其存储在自己的 table 中(仅使用 id
和 data
)并仅在以下情况下访问它如果您正在使用 ORM 并希望一直使用原始实体(您也可以使用a Select
将查询投影到没有 blob 字段的新实体上。
如果您需要一直访问返回行的图像数据,而系统中没有足够的内存用于它,那么运气不好。
我得到了 c# appliaction 和 entity famework
作为 ORM。
我用 table Images
得到了数据库。 Table 有 Id
、TimeStamp
、Data
列。
这个 table 可以有很多实体。此外 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 进行查询,并且排序已完成在对数据库的查询上,而不是在返回的整个集合上)。
除非您需要更改跟踪检测,否则请在您的 DbSet
上使用 AsNoTracking
(在本例中为 Context.Images.AsNoTracking().OrderBy(...)
。这会大大降低内存需求(更改跟踪检测需要内存的两倍多)。
此外,如果使用大型 blob 数据,明智的做法是将其存储在自己的 table 中(仅使用 id
和 data
)并仅在以下情况下访问它如果您正在使用 ORM 并希望一直使用原始实体(您也可以使用a Select
将查询投影到没有 blob 字段的新实体上。
如果您需要一直访问返回行的图像数据,而系统中没有足够的内存用于它,那么运气不好。