4

我有一个程序可以处理一堆包含许多列的 csv 文件,以便用户可以拉出特定的列并将它们写入另一个更小的 csv 文件,并且只包含他们需要的内容。由于最多可以有 800 万行,因此我使用列表创建了一个队列系统,它将片段(一次 50000 行)添加到列表缓冲区,以便编写者可以写入该片段,然后用于listbuffer[i].clear();删除它,这样我使用的内存要少得多,并且还将缓冲区限制为仅包含 10 个项目,从而使总内存使用量保持在我需要的最低水平。

我的问题是,listbuffer[i].clear();直到整个程序完成并且我重新初始化了缓冲区,以便下次使用时它是空白的,它才会释放它以前使用的内存。

**listbuffer 是一个List<List<List<string>>>

只是让这更有意义......

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

有没有办法告诉列表释放list[i]正在使用的内存?

谢谢!

4

3 回答 3

6

是的, usingList<T>.Clear()清除对列表中所有对象的引用并将Count属性设置为0。它不会释放对存储对象引用的底层数组的引用。您可以在清除后将容量属性设置为 0 以释放对该数组的引用。

如果您确实有 OOM 问题,那么这样做并不能完全解决问题,它会产生更多的地址空间碎片问题。检查此答案以获取有关如何避免在大对象堆中创建过多垃圾的提示。

于 2012-06-13T15:24:44.643 回答
3

也许为时已晚,但我写了这个扩展来从大列表中清除内存。

它对我有用,我希望它有所帮助。

延期:

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,这就是所有人……

于 2016-12-16T21:45:30.553 回答
-2

您必须清除列表,然后调用 GC 将其从内存中删除。用广泛的方法如下:

public static void ClearMemory<T>(this List<T> lista)
    {
        int identificador = GC.GetGeneration(lista);
        lista.Clear();
        GC.Collect(identificador, GCCollectionMode.Forced);
    }
于 2019-10-25T14:27:01.847 回答