diff --git a/Modules/Core/Streaming/include/otbStreamingManager.h b/Modules/Core/Streaming/include/otbStreamingManager.h index e5a853309aec737f70898f384c56a7d69dc95c28..cd57e83f9e7ddeda81282d35af4d048a4d837faa 100644 --- a/Modules/Core/Streaming/include/otbStreamingManager.h +++ b/Modules/Core/Streaming/include/otbStreamingManager.h @@ -88,6 +88,9 @@ public: * GetNumberOfSplits() returns. */ virtual RegionType GetSplit(unsigned int i); + itkSetMacro(DefaultRAM, MemoryPrintType); + itkGetMacro(DefaultRAM, MemoryPrintType); + protected: StreamingManager(); ~StreamingManager() override; @@ -111,11 +114,13 @@ private: StreamingManager(const StreamingManager &); //purposely not implemented void operator =(const StreamingManager&); //purposely not implemented - /* Compute the available RAM from configuration settings if the input parameter is 0, - * otherwise, simply returns the input parameter */ + /** Compute the available RAM in Bytes from an input value in MByte. + * If the input value is 0, it uses the m_DefaultRAM value. + * If m_DefaultRAM is also 0, it uses the configuration settings */ MemoryPrintType GetActualAvailableRAMInBytes(MemoryPrintType availableRAMInMB); - + /** Default available RAM in MB */ + MemoryPrintType m_DefaultRAM; }; } // End namespace otb diff --git a/Modules/Core/Streaming/include/otbStreamingManager.txx b/Modules/Core/Streaming/include/otbStreamingManager.txx index d30e3a2580195baf4dc0281fa7826af34e24e5cc..1d76ff1fe498007c5b9bb60fcc7fa80e040733b2 100644 --- a/Modules/Core/Streaming/include/otbStreamingManager.txx +++ b/Modules/Core/Streaming/include/otbStreamingManager.txx @@ -31,6 +31,7 @@ namespace otb template <class TImage> StreamingManager<TImage>::StreamingManager() : m_ComputedNumberOfSplits(0) + , m_DefaultRAM(0) { } @@ -47,8 +48,15 @@ StreamingManager<TImage>::GetActualAvailableRAMInBytes(MemoryPrintType available if (availableRAMInBytes == 0) { - // Retrieve it from the configuration - availableRAMInBytes = 1024*1024*ConfigurationManager::GetMaxRAMHint(); + if (m_DefaultRAM != 0) + { + availableRAMInBytes = 1024*1024*m_DefaultRAM; + } + else + { + // Retrieve it from the configuration + availableRAMInBytes = 1024*1024*ConfigurationManager::GetMaxRAMHint(); + } } return availableRAMInBytes; } diff --git a/Modules/IO/ImageIO/include/otbImageFileWriter.txx b/Modules/IO/ImageIO/include/otbImageFileWriter.txx index 87a0d50453a74b4ecb3c5554428c1623b9576489..677ea22b4bab59d04121735bd58990ca0b516ec4 100644 --- a/Modules/IO/ImageIO/include/otbImageFileWriter.txx +++ b/Modules/IO/ImageIO/include/otbImageFileWriter.txx @@ -294,11 +294,17 @@ ImageFileWriter<TInputImage> sizemode = m_FilenameHelper->GetStreamingSizeMode(); } - double sizevalue = 0.; + unsigned int sizevalue = 0; + // Save the DefaultRAM value for later + unsigned int oldDefaultRAM = m_StreamingManager->GetDefaultRAM(); + if (sizemode == "auto") + { + sizevalue = oldDefaultRAM; + } if(m_FilenameHelper->StreamingSizeValueIsSet()) { - sizevalue = m_FilenameHelper->GetStreamingSizeValue(); + sizevalue = static_cast<unsigned int>(m_FilenameHelper->GetStreamingSizeValue()); } if(type == "auto") @@ -307,7 +313,7 @@ ImageFileWriter<TInputImage> { otbLogMacro(Warning,<<"In auto streaming type, the sizemode option will be ignored."); } - if(sizevalue == 0.) + if(sizevalue == 0) { otbLogMacro(Warning,<<"sizemode is auto but sizevalue is 0. Value will be fetched from the OTB_MAX_RAM_HINT environment variable if set, or else use the default value"); } @@ -317,7 +323,7 @@ ImageFileWriter<TInputImage> { if(sizemode == "auto") { - if(sizevalue == 0.) + if(sizevalue == 0) { otbLogMacro(Warning,<<"sizemode is auto but sizevalue is 0. Value will be fetched from the OTB_MAX_RAM_HINT environment variable if set, or else use the default value"); } @@ -325,27 +331,27 @@ ImageFileWriter<TInputImage> } else if(sizemode == "nbsplits") { - if(sizevalue == 0.) + if(sizevalue == 0) { otbLogMacro(Warning,<<"Streaming sizemode is set to nbsplits but sizevalue is 0. This will result in upredicted behaviour. Please consider setting the sizevalue by using &streaming:sizevalue=x."); } - this->SetNumberOfDivisionsTiledStreaming(static_cast<unsigned int>(sizevalue)); + this->SetNumberOfDivisionsTiledStreaming(sizevalue); } else if(sizemode == "height") { - if(sizevalue == 0.) + if(sizevalue == 0) { otbLogMacro(Warning,<<"Streaming sizemode is set to height but sizevalue is 0. This will result in upredicted behaviour. Please consider setting the sizevalue by using &streaming:sizevalue=x."); } - this->SetTileDimensionTiledStreaming(static_cast<unsigned int>(sizevalue)); + this->SetTileDimensionTiledStreaming(sizevalue); } } else if(type == "stripped") { if(sizemode == "auto") { - if(sizevalue == 0.) + if(sizevalue == 0) { otbLogMacro(Warning,<<"sizemode is auto but sizevalue is 0. Value will be fetched from configuration file if any, or from cmake configuration otherwise."); } @@ -354,30 +360,34 @@ ImageFileWriter<TInputImage> } else if(sizemode == "nbsplits") { - if(sizevalue == 0.) + if(sizevalue == 0) { otbLogMacro(Warning,<<"Streaming sizemode is set to nbsplits but sizevalue is 0. This will result in upredicted behaviour. Please consider setting the sizevalue by using &streaming:sizevalue=x."); } - this->SetNumberOfDivisionsStrippedStreaming(static_cast<unsigned int>(sizevalue)); + this->SetNumberOfDivisionsStrippedStreaming(sizevalue); } else if(sizemode == "height") { - if(sizevalue == 0.) + if(sizevalue == 0) { otbLogMacro(Warning,<<"Streaming sizemode is set to height but sizevalue is 0. This will result in upredicted behaviour. Please consider setting the sizevalue by using &streaming:sizevalue=x."); } - this->SetNumberOfLinesStrippedStreaming(static_cast<unsigned int>(sizevalue)); + this->SetNumberOfLinesStrippedStreaming(sizevalue); } } else if (type == "none") { - if(sizemode!="" || sizevalue!=0.) + if(sizemode!="" || sizevalue!=0) { otbLogMacro(Warning,<<"Streaming is explicitly disabled, sizemode and sizevalue will be ignored."); } this->SetNumberOfDivisionsTiledStreaming(0); } + + // since we change the m_StreamingManager under the hood, we copy the DefaultRAM + // value to the new streamingManager. + m_StreamingManager->SetDefaultRAM(oldDefaultRAM); } else { @@ -468,7 +478,6 @@ ImageFileWriter<TInputImage> */ inputPtr->UpdateOutputInformation(); InputImageRegionType inputRegion = inputPtr->GetLargestPossibleRegion(); - typename TInputImage::PointType origin = inputPtr->GetOrigin(); /** Parse region size modes */ if(m_FilenameHelper->BoxIsSet()) @@ -485,9 +494,7 @@ ImageFileWriter<TInputImage> size[0] = boxVector[2]; // size along X size[1] = boxVector[3]; // size along Y inputRegion.SetSize(size); - - m_ShiftOutputIndex = start; - inputRegion.SetIndex(m_ShiftOutputIndex); + inputRegion.SetIndex(start); if (!inputRegion.Crop(inputPtr->GetLargestPossibleRegion())) { @@ -501,11 +508,9 @@ ImageFileWriter<TInputImage> e.SetDataObject(inputPtr); throw e; } - - inputPtr->TransformIndexToPhysicalPoint(inputRegion.GetIndex(), origin); - otbLogMacro(Info,<<"Writing user defined region ["<<start[0]<<", "<<start[0]+size[0]-1<<"]x["<<start[1]<<", "<<start[1]+size[1]<<"]"); } + m_ShiftOutputIndex = inputRegion.GetIndex(); /** * Determine of number of pieces to divide the input. This will be the @@ -544,6 +549,8 @@ ImageFileWriter<TInputImage> // // Setup the ImageIO with information from inputPtr // + typename TInputImage::PointType origin; + inputPtr->TransformIndexToPhysicalPoint(inputRegion.GetIndex(), origin); const typename TInputImage::SpacingType& spacing = inputPtr->GetSpacing(); const typename TInputImage::DirectionType& direction = inputPtr->GetDirection(); m_ImageIO->SetNumberOfDimensions(TInputImage::ImageDimension); @@ -665,7 +672,7 @@ ImageFileWriter<TInputImage> //Reset global shift on input region (box parameter) //It allows calling multiple update over the writer - m_ShiftOutputIndex.Fill(0); + m_ShiftOutputIndex = inputPtr->GetLargestPossibleRegion().GetIndex(); } @@ -721,10 +728,7 @@ ImageFileWriter<TInputImage> InputImageRegionType ioRegion; // No shift of the ioRegion from the buffered region is expected - typename InputImageRegionType::IndexType tmpIndex; - tmpIndex.Fill(0); itk::ImageIORegionAdaptor<TInputImage::ImageDimension>:: - //Convert(m_ImageIO->GetIORegion(), ioRegion, tmpIndex); Convert(m_ImageIO->GetIORegion(), ioRegion, m_ShiftOutputIndex); InputImageRegionType bufferedRegion = input->GetBufferedRegion(); diff --git a/Modules/MPI/MPITiffWriter/include/otbSimpleParallelTiffWriter.txx b/Modules/MPI/MPITiffWriter/include/otbSimpleParallelTiffWriter.txx index 336f399df82f4fb35c9e3c820d3e9a319fdb6ff3..9a3790c872e8f11dc6f0dc65ef0c565e26794cde 100644 --- a/Modules/MPI/MPITiffWriter/include/otbSimpleParallelTiffWriter.txx +++ b/Modules/MPI/MPITiffWriter/include/otbSimpleParallelTiffWriter.txx @@ -315,11 +315,16 @@ SimpleParallelTiffWriter<TInputImage> sizemode = m_FilenameHelper->GetStreamingSizeMode(); } - double sizevalue = 0.; - + unsigned int sizevalue = 0; + // Save the DefaultRAM value for later + unsigned int oldDefaultRAM = m_StreamingManager->GetDefaultRAM(); + if (sizemode == "auto") + { + sizevalue = oldDefaultRAM; + } if(m_FilenameHelper->StreamingSizeValueIsSet()) { - sizevalue = m_FilenameHelper->GetStreamingSizeValue(); + sizevalue = static_cast<unsigned int>(m_FilenameHelper->GetStreamingSizeValue()); } if(type == "auto") @@ -328,7 +333,7 @@ SimpleParallelTiffWriter<TInputImage> { itkWarningMacro(<<"In auto streaming type, the sizemode option will be ignored."); } - if(sizevalue == 0.) + if(sizevalue == 0) { itkWarningMacro("sizemode is auto but sizevalue is 0. Value will be fetched from configuration file if any, or from cmake configuration otherwise."); } @@ -338,7 +343,7 @@ SimpleParallelTiffWriter<TInputImage> { if(sizemode == "auto") { - if(sizevalue == 0.) + if(sizevalue == 0) { itkWarningMacro("sizemode is auto but sizevalue is 0. Value will be fetched from configuration file if any, or from cmake configuration otherwise."); } @@ -346,27 +351,27 @@ SimpleParallelTiffWriter<TInputImage> } else if(sizemode == "nbsplits") { - if(sizevalue == 0.) + if(sizevalue == 0) { itkWarningMacro("Streaming sizemode is set to nbsplits but sizevalue is 0. This will result in upredicted behaviour. Please consider setting the sizevalue by using &streaming:sizevalue=x."); } - this->SetNumberOfDivisionsTiledStreaming(static_cast<unsigned int>(sizevalue)); + this->SetNumberOfDivisionsTiledStreaming(sizevalue); } else if(sizemode == "height") { - if(sizevalue == 0.) + if(sizevalue == 0) { itkWarningMacro("Streaming sizemode is set to height but sizevalue is 0. This will result in upredicted behaviour. Please consider setting the sizevalue by using &streaming:sizevalue=x."); } - this->SetTileDimensionTiledStreaming(static_cast<unsigned int>(sizevalue)); + this->SetTileDimensionTiledStreaming(sizevalue); } } else if(type == "stripped") { if(sizemode == "auto") { - if(sizevalue == 0.) + if(sizevalue == 0) { itkWarningMacro("sizemode is auto but sizevalue is 0. Value will be fetched from configuration file if any, or from cmake configuration otherwise."); } @@ -375,30 +380,34 @@ SimpleParallelTiffWriter<TInputImage> } else if(sizemode == "nbsplits") { - if(sizevalue == 0.) + if(sizevalue == 0) { itkWarningMacro("Streaming sizemode is set to nbsplits but sizevalue is 0. This will result in upredicted behaviour. Please consider setting the sizevalue by using &streaming:sizevalue=x."); } - this->SetNumberOfDivisionsStrippedStreaming(static_cast<unsigned int>(sizevalue)); + this->SetNumberOfDivisionsStrippedStreaming(sizevalue); } else if(sizemode == "height") { - if(sizevalue == 0.) + if(sizevalue == 0) { itkWarningMacro("Streaming sizemode is set to height but sizevalue is 0. This will result in upredicted behaviour. Please consider setting the sizevalue by using &streaming:sizevalue=x."); } - this->SetNumberOfLinesStrippedStreaming(static_cast<unsigned int>(sizevalue)); + this->SetNumberOfLinesStrippedStreaming(sizevalue); } } else if (type == "none") { - if(sizemode!="" || sizevalue!=0.) + if(sizemode!="" || sizevalue!=0) { itkWarningMacro("Streaming is explicitly disabled, sizemode and sizevalue will be ignored."); } this->SetNumberOfDivisionsTiledStreaming(0); } + + // since we change the m_StreamingManager under the hood, we copy the DefaultRAM + // value to the new streamingManager. + m_StreamingManager->SetDefaultRAM(oldDefaultRAM); } else { diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputImageParameter.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputImageParameter.cxx index 32b0cfaa497bed989fedf6d01a20b1763dc0bf28..09396447765610f1b1f2dd903943b9a2cc116922 100644 --- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputImageParameter.cxx +++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputImageParameter.cxx @@ -207,6 +207,7 @@ ClampAndWriteVectorImage( itk::ImageBase<2> * in , sptWriter->SetFileName(filename); sptWriter->SetInput(clampFilter->GetOutput()); sptWriter->SetAutomaticAdaptativeStreaming(ramValue); + sptWriter->GetStreamingManager()->SetDefaultRAM(ramValue); sptWriter->Update(); } @@ -222,10 +223,9 @@ ClampAndWriteVectorImage( itk::ImageBase<2> * in , if(useStandardWriter) { - - writer->SetFileName( filename ); - writer->SetInput(clampFilter->GetOutput()); - writer->SetAutomaticAdaptativeStreaming(ramValue); + writer->SetFileName( filename ); + writer->SetInput(clampFilter->GetOutput()); + writer->GetStreamingManager()->SetDefaultRAM(ramValue); writer->Update(); } } @@ -348,7 +348,7 @@ OutputImageParameter::SwitchRGBAImageWrite() { m_RGBAUInt8Writer->SetFileName( this->GetFileName() ); m_RGBAUInt8Writer->SetInput(dynamic_cast<UInt8RGBAImageType*>(m_Image.GetPointer()) ); - m_RGBAUInt8Writer->SetAutomaticAdaptativeStreaming(m_RAMValue); + m_RGBAUInt8Writer->GetStreamingManager()->SetDefaultRAM(m_RAMValue); m_RGBAUInt8Writer->Update(); } else @@ -363,7 +363,7 @@ OutputImageParameter::SwitchRGBImageWrite() { m_RGBUInt8Writer->SetFileName( this->GetFileName() ); m_RGBUInt8Writer->SetInput(dynamic_cast<UInt8RGBImageType*>(m_Image.GetPointer()) ); - m_RGBUInt8Writer->SetAutomaticAdaptativeStreaming(m_RAMValue); + m_RGBUInt8Writer->GetStreamingManager()->SetDefaultRAM(m_RAMValue); m_RGBUInt8Writer->Update(); } else