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

A scalable collection for large indeterminate dataset

我有一个处理大型数据集的进程,在 Parallel.ForEach 中处理记录,然后将结果存储在 ConcurrentQueue<List<string>> 中。于是处理了一条记录,记录中的每一个字段都会产生一个字符串,然后添加到List中。在记录的末尾 List 然后是 Enqueued,并在保存所有已处理记录的 ConcurrentQueue 上进行进一步处理。

处理集合几个小时后,我注意到我的 CPU 使用率从新浪潮上升到相当高的水平,并且处理一组记录的时间开始增加。

我这里的假设是 List 被填满然后复制到一个新的更大的 List。随着大小的增长,CPU 需要跟上这个容量,初始化周期也会增长。我正在使用的数据集大小不确定,因为每条记录都有数量可变的子记录。父记录数一般在500k左右

所以我的第一个想法是将List初始化为父记录的Count。由于子记录,List 仍然需要增长,但至少增长的次数会更少。但是是否有其他一些可扩展性更好的 List 集合替代方案?或者与我的第一直觉不同的方法似乎更好?

ConcurrentQueue 是作为链表实现的,不需要调整容量大小(与常规队列不同)。 所以你的问题会在别处。

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

其他提示:

  • 如果从字段构造字符串时有很多字符串操作,请使用 Stringbuilder(如果您尚未这样做)。
  • 如果记录中有很多字段并且您有办法预先知道有多少:对每个记录使用数组而不是列表,或者将列表容量设置为可容纳所有字符串的值记录。