我将 2 个非常大的数据集放入内存,执行连接以从第一个集合中过滤出一个子集,然后尝试销毁第二个集合,因为它使用了大约 600MB 的系统 RAM。问题是下面的代码不起作用。下面的代码运行后,会运行一个 foreach 循环,大约需要 15 分钟。在此期间,内存不会从 600MB+ 减少。我做错了什么吗?
List<APPLES> tmpApples = dataContext.Apples.ToList(); // 100MB
List<ORANGES> tmpOranges = dataContext.Oranges.ToList(); // 600MB
List<APPLES> filteredApples = tmpApples
.Join(tmpOranges, apples => apples.Id, oranges => oranges.Id, (apples, oranges) => apples).ToList();
tmpOranges.Clear();
tmpOranges = null;
GC.Collect();
请注意,我稍后会重新使用 tmpApples,所以我现在不会清除它..
最佳答案
一些注意事项:
- 除非您的
dataContext
可以被清除/垃圾收集,否则很可能会保留对很多对象的引用 - 调用
Clear()
然后将变量设置为 null 是没有意义的,如果您真的没有对列表做任何其他事情的话。在几乎所有情况下,GC 都可以判断您何时不再使用变量。 - 大概是在判断进程预留了多少内存;我不认为 CLR 实际上会将内存返回给操作系统,但是通过垃圾回收释放的内存将可用于在 CLR 中进一步使用。 (编辑:根据下面的评论,CLR 有可能释放大型对象堆的区域,但我不确定。)
关于C# 无法清除大型泛型集合的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5470300/