处理大量数据

Working with a large amount of data

我得到了 c# appliaction 和 entity famework 作为 ORM。 我用 table Images 得到了数据库。 Table 有 IdTimeStampData 列。 这个 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 中(仅使用 iddata)并仅在以下情况下访问它如果您正在使用 ORM 并希望一直使用原始实体(您也可以使用a Select 将查询投影到没有 blob 字段的新实体上。

如果您需要一直访问返回行的图像数据,而系统中没有足够的内存用于它,那么运气不好。