diff --git a/Modules/Learning/Sampling/include/otbPersistentSamplingFilterBase.txx b/Modules/Learning/Sampling/include/otbPersistentSamplingFilterBase.txx index 0d217c677e42d3cfd8f0fbdbf2bd41e1420a03d3..12e0f22aacd5a825b6e41fe87b84497eab6dd212 100644 --- a/Modules/Learning/Sampling/include/otbPersistentSamplingFilterBase.txx +++ b/Modules/Learning/Sampling/include/otbPersistentSamplingFilterBase.txx @@ -174,6 +174,16 @@ PersistentSamplingFilterBase<TInputImage,TMaskImage> // clean temporary inputs this->m_InMemoryInputs.clear(); + unsigned int numberOfThreads = this->GetNumberOfThreads(); + + unsigned int actualNumberOfThreads = numberOfThreads; + + if(numberOfThreads > this->GetOutput()->GetRequestedRegion().GetSize()[1]) + { + actualNumberOfThreads = this->GetOutput()->GetRequestedRegion().GetSize()[1]; + } + + // gather temporary outputs and write to output const otb::ogr::DataSource* vectors = this->GetOGRData(); itk::TimeProbe chrono; @@ -195,7 +205,7 @@ PersistentSamplingFilterBase<TInputImage,TMaskImage> itkExceptionMacro(<< "Unable to start transaction for OGR layer " << outLayer.ogr().GetName() << "."); } - for (unsigned int thread=0 ; thread < this->GetNumberOfThreads() ; thread++) + for (unsigned int thread=0 ; thread < actualNumberOfThreads ; thread++) { ogr::Layer inLayer = this->m_InMemoryOutputs[thread][count]->GetLayerChecked(0); if (!inLayer) @@ -247,7 +257,7 @@ PersistentSamplingFilterBase<TInputImage,TMaskImage> TInputImage* outputImage = this->GetOutput(); RegionType requestedRegion = outputImage->GetRequestedRegion(); - ogr::Layer layer = this->m_InMemoryInputs[threadid]->GetLayerChecked(0); + ogr::Layer layer = this->m_InMemoryInputs.at(threadid)->GetLayerChecked(0); if (! layer) { return; @@ -618,6 +628,13 @@ PersistentSamplingFilterBase<TInputImage,TMaskImage> unsigned int numberOfThreads = this->GetNumberOfThreads(); + unsigned int actualNumberOfThreads = numberOfThreads; + + if(numberOfThreads > this->GetOutput()->GetRequestedRegion().GetSize()[1]) + { + actualNumberOfThreads = this->GetOutput()->GetRequestedRegion().GetSize()[1]; + } + // prepare temporary input : split input features between available threads this->m_InMemoryInputs.clear(); std::string tmpLayerName("thread"); @@ -628,7 +645,7 @@ PersistentSamplingFilterBase<TInputImage,TMaskImage> } OGRFeatureDefn &layerDefn = inLayer.GetLayerDefn(); std::vector<ogr::Layer> tmpLayers; - for (unsigned int i=0 ; i < numberOfThreads ; i++) + for (unsigned int i=0 ; i < actualNumberOfThreads ; i++) { ogr::DataSource::Pointer tmpOgrDS = ogr::DataSource::New(); ogr::Layer tmpLayer = tmpOgrDS->CreateLayer( @@ -678,9 +695,17 @@ PersistentSamplingFilterBase<TInputImage,TMaskImage> { // Prepare in-memory outputs unsigned int numberOfThreads = this->GetNumberOfThreads(); + + unsigned int actualNumberOfThreads = numberOfThreads; + + if(numberOfThreads > this->GetOutput()->GetRequestedRegion().GetSize()[1]) + { + actualNumberOfThreads = this->GetOutput()->GetRequestedRegion().GetSize()[1]; + } + this->m_InMemoryOutputs.clear(); std::string tmpLayerName("threadOut"); - for (unsigned int i=0 ; i < numberOfThreads ; i++) + for (unsigned int i=0 ; i < actualNumberOfThreads ; i++) { std::vector<OGRDataPointer> tmpContainer; // iterate over outputs, only process ogr::DataSource