0

SQL-Compact 3.5データベースとEFでインターフェイスするアプリケーションをテストする際に、ボトルネックが発生しました。継承されたエンティティでPLINQを実行するとAccessViolationExceptionがスローされる

通常、私はこのようなボトルネックに遭遇すると、何千ものエントリで満たされたデータベースで同じlinqクエリを12回再実行するため、linqクエリの回数を減らすためにlinqクエリを修正しますオーバーヘッドの次に、インスタンス化の時間を短縮するためにplinqを使用します。

これを行うには、ShapeEntitiesテーブルでこれを実行しようとするまで、かなりうまくいきました。

ShapeEntityは、互いにほぼ同じ他のエンティティの基本クラスとして機能する抽象エンティティです。私はAsParallel()メソッドでこれを実行することはできません。

HashSet<Guid> keys ... 

var x = 
    from shape in model.ShapeEntities.AsParallel() 
    where keys.Contains(shape.ImageKey) 
    select shape; 

List<ShapeEntity> shapes = new List<ShapeEntity>(x); 

上記のコードからAsParallel()を削除すると、クエリを実行するのに約1.4秒かかります。 AsParallel()メソッドでは、約40秒後にAccessViolationExceptionが発生します。それは過去のインスタンス化を得ることはありません。

誰かがこれをスピードアップする方法について考えていますか?私はImageEntity.ShapeEntitiesを実行できません。ImageEntityごとに1.2秒になるからです。

+0

EFコンテキストはスレッドセーフではないと思います。私はあなたがPLINQでそれらを使うことができないことを意味していると確信しています。 – Gabe

答えて

0

エンティティフレームワークコンテキストはスレッドセーフではありません。 From MSDN

ObjectContextクラスはスレッドセーフではありません。 ObjectContext内のデータ オブジェクトの整合性は、マルチスレッドの シナリオでは保証されません。

あなたがそうでなければ、いくつかのページングメカニズムを実装NoTrackingMergeOption

model.ShapeEntitie.MergeOption = MergeOption.NoTracking; 

を使用して数ミリ秒を保存することができ、読み取り専用の目的のためにのために、これらのエンティティを取得している場合。

+0

このコンテキストでは、ページング・メカニズムは何を意味しますか? – Gabe

+0

私はNoTrackingオプションを試しましたが、MergeOptionsを混ぜ合わせて一致させたくありません。これらのテーブルは読み込み専用ですが、それ以上のテーブルはいつでも編集できます。 –

関連する問題