4

私はEntityFrameworkを初めて使用します。

そして私は1つの懸念があります:

LINQ to Entitiesを介して収集された非常に大量のデータをウォークスルーする必要があります。このデータは、匿名タイプの異なるエンティティからのいくつかのプロパティを組み合わせたものです。

このクエリの返されたアイテムを最後まで1つずつ読み取る必要がある場合、コレクションがBIGであるか、EFが暗黙的にSqlDataReaderを使用するため、OutOfMemory例外のリスクがありますか?

(または、EntityDateReaderを使用して、Dbを順番に読み取っていることを確認する必要があります(ただし、クエリを文字列として生成する必要があります))

4

2 に答える 2

4

私が見ているように、あなたができることは2つあります。まず、.AsNoTrackingを使用してトラッキングをオフにします。これにより、ほとんどの場合、メモリセットが半分になります。

それでもセットが大きすぎる場合は、スキップして、結果セットをチャンクにプルダウンします。また、これをAsNoTrackingと組み合わせて使用​​して、トラッキングでメモリが消費されないようにする必要があります

編集:

たとえば、次のようなものを使用して、1000のチャンクですべてのアイテムをループすることができます。以下のコードは、一度に1000アイテムのみをメモリに保持する必要があります。

int numberOfItems = ctx.MySet.Count();

for(int i = 0; i < numberOfItems + 1000; i+=1000)
{
    foreach(var item in ctx.MySet.AsNoTracking().Skip(i).Take(1000).AsEnumerable())
    {
         //do stuff with your entity
    }
}
于 2012-10-12T07:24:06.773 に答える
0

データ量があなたが言ったほど大きい場合は、そのような場合にはEFを使用しないことをお勧めします。EFは優れていますが、パフォーマンスを向上させるために、フォールバックして標準SQLを使用する必要がある場合があります。

Dapper.NEThttps://github.com/SamSaffron/dapper-dot-netをご覧ください

本当にすべての場合にEFを使用したい場合は、境界コンテキスト(複数のDBContext)を使用することをお勧めします。

モデルを複数の小さなコンテキストに分割すると、EFがコンテキストのメモリ内モデルを作成するときに使用するリソースが少なくなるため、パフォーマンスが向上します。

コンテキストが大きいほど、そのメモリ内モデルを生成および維持するために費やされるリソースが多くなります。

また、複数のコンテキストのインスタンスを共有するときにデタッチおよびアタッチできるため、すべてのモデルをロードする必要はありません。

于 2012-10-12T07:34:50.667 に答える