流和线程化

流媒体和线程化是两件不同的事情,即使它们在一定程度上联系在一起。在OTB:

  • 流式处理描述了将大图像的几个部分的处理结合在一起,并使输出与一次性处理整个图像所获得的输出相同的能力。当你处理千兆字节的图像时,流媒体是必须的。
  • 线程化是同时处理图像不同部分的能力。只有在您使用较新的处理器的情况下,线程才会给您带来一些好处。

总而言之:如果你有大的图像,流媒体是好的,如果你有几个处理单元,线程是好的。

然而,这两个属性并非互不相关。两者都依赖于过滤功能来处理图像的各个部分并合并结果,这就是 ThreadedGenerateData() 方法可以做到。

OTB中的流和线程化

对于OTB,流是流水线相关的,而线程是过滤器相关的。如果您构建的管道中有一个滤镜不可流式处理,则整个管道也不可流式处理:在某一时刻,您可能会将整个图像保存在内存中。然而,即使管道的其余部分是由不可线程的过滤器组成的,您也将受益于线程过滤器(此特定过滤器的处理时间将更短)。

即使您使用非流传输编写器,每个具有 ThreadedGenerateData() 将把图像一分为二,并将每个部分发送到一个线程,您会注意到对该函数的两次调用。

如果您有一些特定的要求,并且只想使用一个线程,则可以调用 SetNumberOfThreads() 方法对每个筛选器执行操作。

当您编写自己的筛选器时,您必须遵循一些规则以使您的筛选器可流水化和线程化。以下各节提供了一些详细信息 大数据流传输线程筛选器执行

分工战略

意象的分化一般发生在作者层面。有不同的策略可用,并且可以明确指定。在OTB中,这些被称为 splitter 。几个可用的拆分器包括:

您可以根据这些示例添加您自己的策略。

要更改编写器的拆分策略,可以使用以下模型:

typedef otb::ImageRegionNonUniformMultidimensionalSplitter<3> splitterType;
splitterType::Pointer splitter=splitterType::New() ;
writer->SetRegionSplitter(splitter);