データベースから 100 万件のレコードを読み取り、いくつかの処理後にレコードを別のテーブルに挿入するプログラムがあります。そのため、プログラムは DAO API を呼び出して 100 万件のレコードを取得し、メモリ内でループします。挿入も DAO API を使用して挿入を行います。各 DAO API パーツは次のように実装されます。
public static void Main(string[] args)
{
List<TableA> tableAs = GetTableAs();
TableB tableB = null;
foreach (var tableA in tableAs) {
tableB.id = tableA.id;
// ...
// here I copy/modify records from table A
// ...
InsertTableB(tableB);
}
}
public static List<TableA> GetTableAs()
{
using (var ctx = new TableDataContext())
{
var entities = from e in ctx.tableAs
select e;
return new List<tableA>(entities);
}
}
public static void InsertTableB(TableB tableB)
{
using (var ctx = new TableDataContext())
{
ctx.tableBs.InsertOnSubmit(tableB);
ctx.SubmitChanges();
}
}
私のプログラムでは、500k の挿入後に「メモリ不足」の例外が発生しますが、非常に一貫しています。そして、ループ中にメモリ使用量が増加し続けることに気付きました。ガベージコレクションを強制しても、メモリを再利用することはできません。LINQ との対話に問題があるため、メモリが保持され、解放されません。どんな助けでも大歓迎です。