テーブルをループし、すべての行のいくつかの値を変更し、変更をデータベースに保存する次の方法があります。処理を高速化するために、10,000 行のセットでデータを取得しています。これは、2,500 万を超えるレコードを含む大きなテーブルです。
問題は、アプリケーションがメモリを解放していないように見えることです。records
変数をガベージ コレクターに再宣言するnothing
か、ガベージ コレクターを明示的に呼び出しようとしましたが、メモリはそこにとどまります。組み込みの VS10 プロファイラーを実行するsystem.linq.enumerable.tolist()
と、メモリの 98% 以上を占めるメソッドが原因であることがわかります。への呼び出し後にそのメモリを解放するにはどうすればよいsaveChanges
ですか?
db = New databaseEntities
Dim size = 25000000
Dim stepSize = 10000
For i = 0 to size Step stepSize
Dim sql = (From A In db.table).OrderBy(Function(A) A.Column).Skip(i).Take(stepSize)
Dim records As New List(Of table)
records = sql.ToList
For Each record In records
'do some work
Next
db.SaveChanges()
records = Nothing
GC.Collect()
Next