List.clear内存问题

时间:2012-06-13 15:04:38

标签: c# list memory memory-management

我有一个程序可以处理一堆包含许多列的csv文件,以便用户可以提取特定列并将它们写入另一个更小的csv文件,并且只包含它们所需的内容。由于最多可以有800万行,我已经使用列表创建了一个队列系统,它在列表缓冲区中添加了一些(一次50000行),以便编写者可以编写该段,然后使用{{ 1}}删除它,以便我使用更少的内存,并且还将缓冲区限制为仅包含10个项目,使总内存使用量保持在我需要的最低值。

我的问题是listbuffer[i].clear();在整个程序完成之前没有释放它以前使用的内存,而且我已经重新初始化了缓冲区,以便下次使用时它是空白的。

** listbuffer是listbuffer[i].clear();

这样更有意义......

listbuffer [行块] [行#] [列#]

有没有办法告诉列表放开List<List<List<string>>>正在使用的内存?

谢谢!

3 个答案:

答案 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);
    }