IISでホストされているasp.net Webサイトがあります。私は最近、大きな結果セットがデータベースから返され、IISワーカープロセスのメモリが増加し続けていることに気付きました(クエリが実行されるたびに約400MB)。これらの大規模なクエリのうちのいくつかが同時に実行された場合、メモリを食べるだけで(5GBに達したと見ています)、サーバーの速度が低下します。DataTableを使用したASP.NETメモリリーク/高メモリ
データがDataTableにロードされるときに、コードの1行に絞り込みました。
using (SqlConnection connection = new SqlConnection(connectionString))
using (SqlCommand command = new SqlCommand(storedProcedureName, connection))
using(DataTable dataTable = new DataTable())
{
command.CommandType = System.Data.CommandType.StoredProcedure;
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
// Memory Spikes on dataTable.Load
dataTable.Load(reader);
}
}
私が理解していないことは、DataTableに割り当てられているメモリが予想通りに処理されていないようです。 DataTableが範囲外になったり、ユーザーがサイトから離れたり、ユーザーがサイトからログアウトした場合でも、メモリは同じレベルのままです。これは明らかにマルチユーザシステムの問題です。
私はメモリプロファイラーを使用していて、DataTableで保持されているクエリの結果である何千もの文字列をメモリに保持していますが、ここからどこに行くのかはわかりません。私はこれをどのように扱うべきなのか誤解していますか?
https:// stackoverflow。com/questions/913228/should-i-dispose-dataset-and-datatable/1603516#1603516 – user6144226
1回のクエリの後に400 MBのメモリがありますか? DBから取ったデータセットを最小化することを検討しましたか? – Piotr
Piotr、残念ながら、すぐには可能ではありませんが、それはすべて同じ方法で設計された幅広いレポートを備えたやや古いシステムです。 – IanSoc