非常に大量のバイナリデータをデータベース(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時間年中無休」のアプリケーションであり、そのバイナリデータを操作することがアプリケーションの主な目的です)。
EFを使用しているため、データチャンクにバッファーを再利用できません...
チャンクサイズを小さくして、85Kより小さくする必要がありますか?
それとも妄想ですか?:)