流和线程化¶
流媒体和线程化是两件不同的事情,即使它们在一定程度上联系在一起。在OTB:
- 流式处理描述了将大图像的几个部分的处理结合在一起,并使输出与一次性处理整个图像所获得的输出相同的能力。当你处理千兆字节的图像时,流媒体是必须的。
- 线程化是同时处理图像不同部分的能力。只有在您使用较新的处理器的情况下,线程才会给您带来一些好处。
总而言之:如果你有大的图像,流媒体是好的,如果你有几个处理单元,线程是好的。
然而,这两个属性并非互不相关。两者都依赖于过滤功能来处理图像的各个部分并合并结果,这就是 ThreadedGenerateData()
方法可以做到。
OTB中的流和线程化¶
对于OTB,流是流水线相关的,而线程是过滤器相关的。如果您构建的管道中有一个滤镜不可流式处理,则整个管道也不可流式处理:在某一时刻,您可能会将整个图像保存在内存中。然而,即使管道的其余部分是由不可线程的过滤器组成的,您也将受益于线程过滤器(此特定过滤器的处理时间将更短)。
即使您使用非流传输编写器,每个具有 ThreadedGenerateData()
将把图像一分为二,并将每个部分发送到一个线程,您会注意到对该函数的两次调用。
如果您有一些特定的要求,并且只想使用一个线程,则可以调用 SetNumberOfThreads()
方法对每个筛选器执行操作。
当您编写自己的筛选器时,您必须遵循一些规则以使您的筛选器可流水化和线程化。以下各节提供了一些详细信息 大数据流传输 和 线程筛选器执行 。
分工战略¶
意象的分化一般发生在作者层面。有不同的策略可用,并且可以明确指定。在OTB中,这些被称为 splitter 。几个可用的拆分器包括:
- itk::ImageRegionSplitter
- itk::ImageRegionMultidimensionalSplitter
- otb::ImageRegionNonUniformMultidimensionalSplitter
您可以根据这些示例添加您自己的策略。
要更改编写器的拆分策略,可以使用以下模型:
typedef otb::ImageRegionNonUniformMultidimensionalSplitter<3> splitterType;
splitterType::Pointer splitter=splitterType::New() ;
writer->SetRegionSplitter(splitter);