C#およびEntity Framework 3.5では、数百万のレコードを持つコンテキストがあります。これには約2 GBのRAMが必要です。私がSaveChanges()
と呼ぶとすぐに、それは私の8 GM RAMを満たし始め、交換を開始します。Entity Framework 3.5:オブジェクトを別々のコンテキストで段階的に保存する
私はプロファイラを使用しましたが、メモリを浪費していたSQLクエリであることが判明しました。
今、バッチで保存したいのですが、問題が発生しています。
私はLocations
のコレクションを持っています(これには、コレクションのコレクションとサブコレクションがあります)。私はバッチで、それぞれに新しいコンテキストを割り当てることを分割すると、できるだけ早く私はでcontext.AddToOrder(firstBatch)
、ALL場所がそうであるように、すべてのバッチが突然、彼らがOrder
を持っていないにもかかわらず、実体状態Added
を持っています。これにより、Order -> Location
の関係が存在しないため、保存に失敗します。
私は元のコレクション内のすべてのオブジェクトがコンテキストのサブセットのみを追加すると、状態Added
になるのはなぜですか?
すべてのメモリがアプリケーションで使用されていますか?またはおそらくそれはSQL Serverによって使用されました。 –
すべてのSQLクエリ文字列はどこかで生成されなければならず、私はそれがRAMであると推測しています。トランザクションスコープを使用して、チャンクだけを保存するのはどうでしょうか? – linkerro
これはSQLサーバーではなく、別のマシンです。トランザクションの範囲についてそれは多分可能性がありますが、私が最後に試したとき(数週間前)には、サーバー上に非常に多くの奇妙な設定が必要でした。再起動が必要で、今すぐサーバーを再起動することはできません。とにかく、活動モニタを見た後、SQLは実際にRAMを消費している間にまだ実行されていません。 – Halfgaar