处理从BlockingCollection读取的对象

时间:2012-09-28 20:58:47

标签: c# performance parallel-processing task-parallel-library

我必须解析很多文件。所以现在我打开一个文件来读取解析内容并将输出写在不同的位置。 这基本上是我需要做的,但我想加快这个过程,因为我正在解析14000个文件。

我通过在多个线程上分割工作来改进我的算法。所以我有1个线程在接下来的25%中执行25%的文件,依此类推。

无论如何,如果我有以下情况,我相信我会大幅提升性能和速度:

  1. Task 1读取文件并将文件内容放在BlockingCollection1(内存)中
  2. Task 2将创建多个线程来解析BlockingCollection1的内容,并将解析后的数据放入BlockingCollection2
  3. Task 3BlockingCollection2读取内容并将其写入磁盘。
  4. 我现在遇到的问题是我的内存不足异常。我想让垃圾收集器从BlockingCollection1中删除项目(如果已经使用过)。如果已将BlockingCollection2内的项目写入磁盘,我也会将其删除。

    使用BlockingCollection<T>非常方便,因为一个线程可以向该集合添加项目,而另一个线程可以处理这些项目。在我使用链接列表但我倾斜之前在这个问题中:https://stackoverflow.com/a/12519345/637142 BlockingCollection的文章和用途如何。 无论如何我怎么能解决这个问题?我是否必须使用不同类型的集合,例如堆栈?

1 个答案:

答案 0 :(得分:3)

创建BlockingCollection<T>实例时,可以使用接受bounding capacity的构造函数。这可以防止您一次将太多项目放入集合中,这可以帮助您限制“生成”项目的数量,以帮助匹配所消耗的项目数。

通过保持这种限制,您可能会阻止自己使用所有内存,因为您不会比将它们写入磁盘更快地处理项目。