7

大規模なデータセット (140 万レコード) を SQL Server から取得し、WinForms アプリケーションのファイルにダンプしようとしています。一度に大量のメモリを保持しないように、ページングを使用して実行しようとしましたが、プロセスは実行中にメモリ フットプリントを拡大し続けます。約 25% で、600,000K を占めていました。ページングが間違っていますか?メモリ使用量がそれほど増加しないようにする方法について、いくつかの提案を得ることができますか?

var query = (from organizations in ctxObj.Organizations
                 where organizations.org_type_cd == 1
                 orderby organizations.org_ID
                 select organizations);
int recordCount = query.Count();
int skipTo = 0;
int take = 1000;
if (recordCount > 0)
{
    while (skipTo < recordCount)
    {
        if (skipTo + take > recordCount) 
            take = recordCount - skipTo;

        foreach (Organization o in query.Skip(skipTo).Take(take))
        {
            writeRecord(o);
        }
        skipTo += take;
    }
}
4

4 に答える 4

8

オブジェクト コンテキストは、破棄されるまでメモリ内のオブジェクトに保持されます。メモリ フットプリントが増大し続けるのを防ぐために、各バッチの後にコンテキストを破棄することをお勧めします。

データベースに保存していないため、AsNoTracking()( http://msdn.microsoft.com/en-us/library/gg679352(v=vs.103).aspx )を使用することもできます。

于 2013-11-06T16:45:32.450 に答える