1

非常に大量のバイナリデータをデータベース(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より小さくする必要がありますか?
それとも妄想ですか?:)

4

1 に答える 1

1

LOHフラグメンテーションの問題は、同時にメモリにチャンクが多すぎる場合にのみ発生する可能性がありますが、説明から、「プロセス」ごとに1つのチャンクがあるように見えます。並行プロセスはいくつあると思いますか?多くのプロセスがあると予想される場合は、おそらく十分な処理能力とメモリを備えたHW(64ビットプラットフォーム)も期待します。HWは、非常に多くの並列チャンクを処理するための実際の制限ではありませんか?

とにかく、データベースにストリームを保存する必要がある場合は、FILESTREAMEFなしで使用する必要があります。どんな犠牲を払ってもEFを維持することは、アーキテクチャの失敗です。

于 2012-09-04T07:18:12.110 に答える