0

私は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 が使用されていたとしても) が、最初に噛む問題を与えると思いました ;-)

4

1 に答える 1

0

ほとんどの Visual Studio プロジェクト テンプレートの既定のプラットフォーム ターゲットは x86 です。2GB を超えるメモリを使用できるようにするには、プロジェクトを x64 または任意の CPU をターゲットにするように変更する必要があります。これを行うには、プロジェクトのプロパティの [ビルド] タブに移動し、[プラットフォーム ターゲット] で [任意の CPU] を選択します。

500,000 行を一度にロードすることは、私にはまだ悪い考えのように思えますが、アプローチ #1 では他の問題に遭遇する可能性があります。

于 2013-07-26T15:45:18.430 に答える