实体框架,二进制数据和LOH

时间:2012-09-04 06:02:39

标签: c# .net entity-framework large-object-heap

我需要在数据库(MS SQL)中存储大量二进制数据,并通过EF与此数据库进行交互。不幸的是,EF不支持FILESTREAM(更准确地说,没有流媒体支持)。

所以,我决定将数据存储在块中。块只是一种实体类型:

public class Data
{
  public int Id { get; set; }
  public Collection<Chunk> Chunks { get; set; }
}

public class Chunk
{
  public int Id { get; set; }
  public int DataId { get; set; }
  public byte[] Content { get; set; }
}

首先,我想将块大小限制在某个最佳值,比方说,1 Mb 但后来我记得大型物体和LOH。

据我了解,每个Chunk.Content实例都将被视为具有以下后果的大对象(特别是内存碎片)。因此,Chunk对象的密集创建最终将导致OutOfMemoryException(它是“24/7”应用程序,并且使用该二进制数据是应用程序的主要目的)。

我无法将任何缓冲区重用于数据块,因为我正在使用EF ...
我应该减少块大小,使其更低,然后85K?
还是偏执狂呢? :)

1 个答案:

答案 0 :(得分:1)

LOH碎片问题只有在内存中同时存在太多块时才会发生,但从您的描述看,每个“进程”看起来会有一个块。您期望有多少并发进程?如果您希望有许多进程,那么您很可能也期望HW具有足够的处理能力和内存(64位平台)。处理这么多并行块的硬件不是真正的限制吗?

无论如何,如果您需要将流存储到数据库,您应该只使用FILESTREAM而不使用EF。不惜一切代价保持EF是架构失败。