我有一个处理大型数据集的流程,处理Parallel.ForEach
内的记录,然后将结果存储在ConcurrentQueue<List<string>>
中。因此,处理记录,记录中的每个字段都会生成一个字符串,然后将其添加到List
。在记录结束时List
为Enqueued
,并在ConcurrentQueue
上进行进一步处理,保留所有已处理的记录。
经过几个小时的处理后,我注意到我的CPU使用率已经从新浪潮变为持续相当高,并且处理一组记录的时间开始增长。
我的假设是List
已填充到容量,然后复制到新的更大的List
。随着大小的增加,CPU需要跟上这个容量,初始化周期也会增加。我使用的数据集具有不确定的大小,因为每个记录具有可变数量的子记录。父记录的数量通常在500k的范围内。
所以我的第一个想法是初始化父记录的List
到Count
。由于子记录,List
仍然需要增长,但至少必须增长次数。但是还有其他一些替代List
的集合可以更好地扩展吗?还是一种不同于我的第一直觉的方法似乎更好?
答案 0 :(得分:1)
ConcurrentQueue实现为链接列表,不需要调整容量大小(与常规队列不同)。 所以你的问题将在其他地方。
您可能希望查看清理已处理列表所导致的内存量和垃圾回收率。
其他提示: