大型不确定数据集的可扩展集合
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(如果您尚未这样做)。
- 如果记录中有很多字段并且您有办法预先知道有多少:对每个记录使用数组而不是列表,或者将列表容量设置为可容纳所有字符串的值记录。
我有一个处理大型数据集的进程,在 Parallel.ForEach
中处理记录,然后将结果存储在 ConcurrentQueue<List<string>>
中。于是处理了一条记录,记录中的每一个字段都会产生一个字符串,然后添加到List
中。在记录的末尾 List
然后是 Enqueued
,并在保存所有已处理记录的 ConcurrentQueue
上进行进一步处理。
处理集合几个小时后,我注意到我的 CPU 使用率从新浪潮上升到相当高的水平,并且处理一组记录的时间开始增加。
我这里的假设是 List
被填满然后复制到一个新的更大的 List
。随着大小的增长,CPU 需要跟上这个容量,初始化周期也会增长。我正在使用的数据集大小不确定,因为每条记录都有数量可变的子记录。父记录数一般在500k左右
所以我的第一个想法是将List
初始化为父记录的Count
。由于子记录,List
仍然需要增长,但至少增长的次数会更少。但是是否有其他一些可扩展性更好的 List
集合替代方案?或者与我的第一直觉不同的方法似乎更好?
ConcurrentQueue 是作为链表实现的,不需要调整容量大小(与常规队列不同)。 所以你的问题会在别处。
您可能需要查看清理已处理列表所导致的内存使用量和垃圾回收率。
其他提示:
- 如果从字段构造字符串时有很多字符串操作,请使用 Stringbuilder(如果您尚未这样做)。
- 如果记录中有很多字段并且您有办法预先知道有多少:对每个记录使用数组而不是列表,或者将列表容量设置为可容纳所有字符串的值记录。