C#流设计问题

C#流设计问题,c#,.net,stream,pipeline,C#,.net,Stream,Pipeline,我现在有一个应用程序是管道设计。在第一阶段中,它将一些数据和文件读入流中。有一些中间阶段对数据流进行处理。然后是最后一个阶段,将流写到某个地方。这一切都是连续发生的,一个阶段完成,然后交给下一个阶段 这一切都非常有效,但现在数据量开始变得相当大(可能达到数百GB)。所以我想我需要做点什么来缓解这种情况。我最初的想法是我在寻找一些反馈(作为一个独立的开发人员,我没有任何地方可以反驳这个想法) 我正在考虑创建一个并行管道。从管道开始的对象将创建所有阶段,并在其自己的线程中启动每个阶段。当第一个阶段得

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

这一切都非常有效,但现在数据量开始变得相当大(可能达到数百GB)。所以我想我需要做点什么来缓解这种情况。我最初的想法是我在寻找一些反馈(作为一个独立的开发人员,我没有任何地方可以反驳这个想法)

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

因此,问题是: 1) 关于这个设计的方向有什么高层次的想法吗? 2) 有没有一种更简单的方法可以在这里应用? 3) 有没有什么东西可以重复使用(不是我必须购买的产品)

谢谢


MikeD

对于您建议的设计,如果您还没有仔细阅读,您可能会想好好阅读一下。您需要很好地理解在这种情况下如何使用信号量


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

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


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

生产者/消费者模型是一种很好的方法。微软有他们的新产品,应该为你提供大部分的基础工作。看看这个物体。有一个预览版可用于.NET3.5/VS2008


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

< P>生产者/消费者模型是一个很好的方法。微软有他们的新产品,应该为你提供大部分的基础工作。看看这个物体。有一个预览版可用于.NET3.5/VS2008


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

< P>在每个阶段,你是否读取了整个数据块,进行操作,然后将整个卡盘发送到下一个阶段?p> 如果是这种情况,您将使用“推送”技术,将整个数据块推送到下一阶段。你能用“拉动”技术在更像庄园的溪流中处理事情吗?每个阶段都是一个流,当您从该流中读取数据时,它通过调用read从上一个流中提取数据。在读取每个流时,它以小比特的形式从前一个流中读取、处理并返回处理后的数据。目标流决定从上一个流中读取多少字节,并且您不必消耗大量内存。这就是像BizTalk这样的应用程序的工作方式。有一些关于BizTalk管道流如何工作的博客,我认为这可能正是您想要的

以下是一篇你可能会感兴趣的多部分博客:







在每个阶段,您是否读取整个数据块,进行操作,然后将整个卡盘发送到下一阶段

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

以下是一篇你可能会感兴趣的多部分博客:







并行扩展看起来非常有前景。我想我可以为每个阶段创建一个任务,启动每个阶段,并使用新的并发集合类在阶段之间传递流。我还真的不想使用VS2010,而且我似乎再也找不到预览版了