大型不确定数据集的可扩展集合

时间:2017-08-10 22:10:32

标签: c# scalability

我有一个处理大型数据集的流程,处理Parallel.ForEach内的记录,然后将结果存储在ConcurrentQueue<List<string>>中。因此,处理记录,记录中的每个字段都会生成一个字符串,然后将其添加到List。在记录结束时ListEnqueued,并在ConcurrentQueue上进行进一步处理,保留所有已处理的记录。

经过几个小时的处理后,我注意到我的CPU使用率已经从新浪潮变为持续相当高,并且处理一组记录的时间开始增长。

我的假设是List已填充到容量,然后复制到新的更大的List。随着大小的增加,CPU需要跟上这个容量,初始化周期也会增加。我使用的数据集具有不确定的大小,因为每个记录具有可变数量的子记录。父记录的数量通常在500k的范围内。

所以我的第一个想法是初始化父记录的ListCount。由于子记录,List仍然需要增长,但至少必须增长次数。但是还有其他一些替代List的集合可以更好地扩展吗?还是一种不同于我的第一直觉的方法似乎更好?

1 个答案:

答案 0 :(得分:1)

ConcurrentQueue实现为链接列表,不需要调整容量大小(与常规队列不同)。 所以你的问题将在其他地方。

您可能希望查看清理已处理列表所导致的内存量和垃圾回收率。

其他提示:

  • 如果在从字段构造字符串时有很多字符串操作,请使用Stringbuilder(如果您还没有这样做)。
  • 如果记录中有很多字段,并且您有办法事先知道多少:每个记录使用一个数组而不是List,或者将List-capacity设置为一个值,该值将容纳记录的所有字符串