C#流设计问题

时间:2009-11-19 01:42:07

标签: c# .net stream pipeline

我现在有一个应用程序,它是一个管道设计。在第一阶段,它将一些数据和文件读入流中。有一些中间阶段可以处理数据流。然后有一个最后阶段将流写入某个地方。这一切都是连续发生的,一个阶段完成,然后交给下一个阶段。

这一切都很有效,但现在数据量开始变得更大(可能有数百GB)。所以我想我需要做些什么来缓解这个问题。我最初的想法是我正在寻找一些反馈(作为一个独立的开发人员,我只是没有任何地方可以反驳这个想法)。

我正在考虑创建一个Parallel管道。从管道开始的Object将创建所有阶段,并在其自己的线程中踢掉每个阶段。当第一阶段将流传输到某个特定大小时,它会将该流传递到下一个阶段进行处理并启动它自己的新流以继续填充。这里的想法是最后阶段将关闭流,因为第一阶段是建立一个新的,所以我的内存使用率将保持较低。

所以问题: 1)对此设计方向的任何高层次想法? 2)您能想到的更简单的方法可能适用于此吗? 3)那里有什么东西可以重复使用(不是我必须购买的产品)吗?

谢谢,

拾音

3 个答案:

答案 0 :(得分:1)

生产者/消费者模型是一种很好的方法。微软有他们新的Parallel Extensions,它应该为你提供大部分基础工作。查看Task对象。有一个适用于.NET 3.5 / VS2008的预览版本。

您的第一个任务应该是从流中读取数据块,然后将它们传递给其他任务。然后,在逻辑上适合中间的任务。较小的任务(通常)更好。您需要注意的唯一事项是确保上一个任务按照读取的顺序保存数据(因为中间的所有任务可能以与它们开始时不同的顺序完成)。

答案 1 :(得分:0)

对于您建议的设计,如果您还没有,请在producer/consumer problems上阅读。在这种情况下,您需要很好地理解如何使用信号量。

您可以尝试的另一种方法是创建多个相同的管道,每个管道都在一个单独的线程中。这可能更容易编码,因为它具有更少的线程间通信。但是,根据您的数据,您可能无法以这种方式将其拆分为块。

答案 2 :(得分:0)

在每个阶段,您是否阅读了整个数据块,进行操作,然后将整个夹头发送到下一个阶段?

如果是这种情况,您将使用“推送”技术将整个数据块推送到下一个阶段。你是否能够使用“拉”技术处理更像是庄园的东西?每个阶段都是一个流,当您从该流中读取数据时,它会通过调用read来从上一个流中提取数据。在读取每个流时,它以小位读取前一个流,处理它并返回处理过的数据。目标流确定从上一个流中读取的字节数,并且您不必消耗大量内存。这就是BizTalk等应用程序的工作方式。有一些博客关于BizTalk Pipeline流如何工作,我认为它可能正是你想要的。

以下是您可能感兴趣的多部分博客文章:

Part 1
Part 2
Part 3
Part 4
Part 5