1

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

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

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?
或者是偏执狂?:)

4

1 回答 1

1

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

无论如何,如果您需要将流存储到数据库,您应该FILESTREAM在没有 EF 的情况下简单地使用。不惜一切代价坚持使用 EF 是架构失败。

于 2012-09-04T07:18:12.110 回答