私はEntity Frameworkに問題があります。誰かが助けてくれることを願っています:)
私が実装しようとしている機能: 私のアプリケーションは、サードパーティのアプリケーションから XML ダンプを取得し、データを見て、アプリケーション データベースの内容と比較し、重要な基準に応じてエンティティを更新できる必要があります。エンティティの XML バージョンと DB バージョンの両方に基づいています。
アプローチ: すべてのデータをメモリ (DB の場合は EF) にロードし、メモリ内ですべての比較を行い、更新を DB に書き戻します。
アプローチの背景(オプションの読み物): 私が担当している顧客は、この種の問題に数回直面したことがあり、以前に見つけた解決策にまったく満足していませんでした。彼らは、これが最善のアプローチであると結論付けました。したがって、現時点では別の解決策を探しているわけではありません。むしろ、これを行う方法を見つけるか、合理的な時間内に行うことができないと確信するためです.
私の問題:XMLをメモリにロードすることは問題ありませんでしたが、DBからロードすることははるかに困難でした。問題の核心は、データが接続された 8 つのテーブルに格納され、メイン テーブルに 500,000 行近くあることです。結果は、大量のデータを返す複雑なクエリになります。私はいくつかのアプローチを試しました:
1) SQL Server からの 1 つの大きな要求ですべてをロードするだけです。OutOfMemoryException を取得すると、約 1.6 GB の RAM を使用するまで、読み取り中にしばらくの間、検索が機能しているようです - 空き RAM が 10 GB 近くある場合でも。例外はEF内から発生します。例外が発生した時点で、レコードの約半分が読み取られていました。
2) Skip/Take を使用して、1 つずつ読み上げます。OrderBy が必要なので、主テーブルの主キー (int、順次、自動インクリメントではない) で並べ替えます。これにより、クエリがさらに複雑になり、最後に 15 以上の ORDER BY ステートメントがあり、そのうちの約 5 つは、実際には並べ替え対象の主キーのコピーである列に対するものです。なぜそんなに多くのコピーがあるのか わかりませんが、それらはそこにあります.もちろん、クエリはタイムアウトします.
3)ソートされたメイン テーブルからすべての主キーを選択します。次に、最初の 1000 を取得し、これらの 1000 の最小と最大を含む制限ペアを作成します。完了するまで、1000 のすべてのグループに対して繰り返します。次に、クエリを数回呼び出して、各ペアの 2 つの数値の間の主キーを確認し、一度に 1000 セットを読み込みます。これは非常に遅いことが判明し、1000 のグループごとに 45 秒かかっており、これは許容範囲ではありません。
オプション1が最も有効に機能しているように見えますが、EF の内部でメモリ制限があるようです。これをどうにか調整できないだろうか。
私は、このタスクのために EF を放棄することを考えているところです (アプリケーション全体で EF が使用されていたとしても) が、最初に噛む問題を与えると思いました ;-)