我需要在数据库(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?
还是偏执狂呢? :)
答案 0 :(得分:1)
LOH碎片问题只有在内存中同时存在太多块时才会发生,但从您的描述看,每个“进程”看起来会有一个块。您期望有多少并发进程?如果您希望有许多进程,那么您很可能也期望HW具有足够的处理能力和内存(64位平台)。处理这么多并行块的硬件不是真正的限制吗?
无论如何,如果您需要将流存储到数据库,您应该只使用FILESTREAM
而不使用EF。不惜一切代价保持EF是架构失败。