我在linqpad中执行非常简单的代码。我不明白执行后我的记忆在哪里。它只是占用内存而不想退回。
var step = 200000;
for (int i = 0; i < 1000; i++)
{
//WordStats is linq2sql entity (dataContext.WordStats)
var keys = WordStats.Skip(step*i).Take(step).ToList();
GC.Collect();
}
答案 0 :(得分:2)
LINQ DataContext缓存DataContext中的所有读取对象,即使您自己没有对它们的任何引用。如果稍后查询对象,则会获得缓存版本。
不应该执行GC.Collect()
,而应该清除LINQ上下文的缓存,here is a blogpost描述如何。
简而言之:
const BindingFlags FLAGS = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
var method = context.GetType().GetMethod("ClearCache", FLAGS);
method.Invoke(context, null);
在LINQPad中,您应该将context
替换为this
。
答案 1 :(得分:2)
另一种方法是告诉LINQ to SQL不要首先缓存对象:
this.ObjectTrackingEnabled = false;