我有一个程序可以处理一堆包含许多列的csv文件,以便用户可以提取特定列并将它们写入另一个更小的csv文件,并且只包含它们所需的内容。由于最多可以有800万行,我已经使用列表创建了一个队列系统,它在列表缓冲区中添加了一些(一次50000行),以便编写者可以编写该段,然后使用{{ 1}}删除它,以便我使用更少的内存,并且还将缓冲区限制为仅包含10个项目,使总内存使用量保持在我需要的最低值。
我的问题是listbuffer[i].clear();
在整个程序完成之前没有释放它以前使用的内存,而且我已经重新初始化了缓冲区,以便下次使用时它是空白的。
** listbuffer是listbuffer[i].clear();
这样更有意义......
listbuffer [行块] [行#] [列#]
有没有办法告诉列表放开List<List<List<string>>>
正在使用的内存?
谢谢!
答案 0 :(得分:6)
是的,使用List<T>.Clear()
清除对列表中所有对象的引用,并将Count
属性设置为 0 。它 not 释放对存储对象引用的基础数组的引用。清除后,可以将Capacity属性设置为0,以释放对该阵列的引用。
如果您确实遇到了OOM问题,那么这样做并不是一种治愈方法,它可能会造成更多地址空间碎片问题。检查this answer以获取有关如何避免在大对象堆中创建过多垃圾的提示。
答案 1 :(得分:1)
也许为时已晚,但是我写了这个扩展来清除大型列表中的内存。
它对我有用,我希望它有所帮助。
<强>扩展:强>
public static void LiberarLista<T>(this List<T> lista)
{
lista.Clear();
int identificador = GC.GetGeneration(lista);
GC.Collect(identificador, GCCollectionMode.Forced);
}
示例:强>
List<YourObject> hugeList= LetsRockBigData();
// Your code logic here
// Finish... Let's clear the huge list
hugeList.LiberarLista();
我为没有英语专家而道歉。只有一个来自巴西的DotNerd以及所有人......
答案 2 :(得分:0)
您必须清除该列表,然后调用GC将其从内存中删除。如下采用广泛的方法:
public static void ClearMemory<T>(this List<T> lista)
{
int identificador = GC.GetGeneration(lista);
lista.Clear();
GC.Collect(identificador, GCCollectionMode.Forced);
}