/usr/include/OTB-5.8/otbStreamingManager.txx is in libotb-dev 5.8.0+dfsg-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 | /*=========================================================================
Program: ORFEO Toolbox
Language: C++
Date: $Date$
Version: $Revision$
Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
See OTBCopyright.txt for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#ifndef otbStreamingManager_txx
#define otbStreamingManager_txx
#include "otbStreamingManager.h"
#include "otbConfigurationManager.h"
#include "itkExtractImageFilter.h"
namespace otb
{
template <class TImage>
StreamingManager<TImage>::StreamingManager()
: m_ComputedNumberOfSplits(0)
{
}
template <class TImage>
StreamingManager<TImage>::~StreamingManager()
{
}
template <class TImage>
typename StreamingManager<TImage>::MemoryPrintType
StreamingManager<TImage>::GetActualAvailableRAMInBytes(MemoryPrintType availableRAMInMB)
{
MemoryPrintType availableRAMInBytes = availableRAMInMB * 1024 * 1024;
if (availableRAMInBytes == 0)
{
otbMsgDevMacro(<< "Retrieving available RAM size from configuration");
// Retrieve it from the configuration
availableRAMInBytes = 1024*1024*ConfigurationManager::GetMaxRAMHint();
}
otbMsgDevMacro("RAM used to estimate memory footprint : " << availableRAMInBytes / 1024 / 1024 << " MB")
return availableRAMInBytes;
}
template <class TImage>
unsigned int
StreamingManager<TImage>::EstimateOptimalNumberOfDivisions(itk::DataObject * input, const RegionType ®ion,
MemoryPrintType availableRAM,
double bias)
{
otbMsgDevMacro(<< "availableRAM " << availableRAM)
MemoryPrintType availableRAMInBytes = GetActualAvailableRAMInBytes(availableRAM);
otb::PipelineMemoryPrintCalculator::Pointer memoryPrintCalculator;
memoryPrintCalculator = otb::PipelineMemoryPrintCalculator::New();
// Trick to avoid having the resampler compute the whole
// displacement field
double regionTrickFactor = 1;
ImageType* inputImage = dynamic_cast<ImageType*>(input);
MemoryPrintType pipelineMemoryPrint;
if (inputImage)
{
typedef itk::ExtractImageFilter<ImageType, ImageType> ExtractFilterType;
typename ExtractFilterType::Pointer extractFilter = ExtractFilterType::New();
extractFilter->SetInput(inputImage);
// Define a small region to run the memory footprint estimation,
// around the image center, 100 pixels wide in each dimension
SizeType smallSize;
smallSize.Fill(100);
IndexType index;
index[0] = region.GetIndex()[0] + region.GetSize()[0]/2 - 50;
index[1] = region.GetIndex()[1] + region.GetSize()[1]/2 - 50;
RegionType smallRegion;
smallRegion.SetSize(smallSize);
smallRegion.SetIndex(index);
// In case the image is smaller than 100 pixels in a direction
smallRegion.Crop(region);
extractFilter->SetExtractionRegion(smallRegion);
bool smallRegionSuccess = smallRegion.Crop(region);
if (smallRegionSuccess)
{
otbMsgDevMacro("Using an extract to estimate memory : " << smallRegion)
// the region is well behaved, inside the largest possible region
memoryPrintCalculator->SetDataToWrite(extractFilter->GetOutput() );
regionTrickFactor = static_cast<double>( region.GetNumberOfPixels() )
/ static_cast<double>(smallRegion.GetNumberOfPixels() );
memoryPrintCalculator->SetBiasCorrectionFactor(regionTrickFactor * bias);
}
else
{
otbMsgDevMacro("Using the input region to estimate memory : " << region)
// the region is not well behaved
// use the full region
memoryPrintCalculator->SetDataToWrite(input);
memoryPrintCalculator->SetBiasCorrectionFactor(bias);
}
memoryPrintCalculator->Compute();
pipelineMemoryPrint = memoryPrintCalculator->GetMemoryPrint();
if (smallRegionSuccess)
{
// remove the contribution of the ExtractImageFilter
MemoryPrintType extractContrib =
memoryPrintCalculator->EvaluateDataObjectPrint(extractFilter->GetOutput());
pipelineMemoryPrint -= extractContrib;
}
}
else
{
// Use the original object to estimate memory footprint
memoryPrintCalculator->SetDataToWrite(input);
memoryPrintCalculator->SetBiasCorrectionFactor(1.0);
memoryPrintCalculator->Compute();
pipelineMemoryPrint = memoryPrintCalculator->GetMemoryPrint();
}
unsigned int optimalNumberOfDivisions =
otb::PipelineMemoryPrintCalculator::EstimateOptimalNumberOfStreamDivisions(pipelineMemoryPrint, availableRAMInBytes);
otbMsgDevMacro( "Estimated Memory print for the full image : "
<< static_cast<unsigned int>(pipelineMemoryPrint * otb::PipelineMemoryPrintCalculator::ByteToMegabyte ) << std::endl)
otbMsgDevMacro( "Optimal number of stream divisions: "
<< optimalNumberOfDivisions << std::endl)
return optimalNumberOfDivisions;
}
template <class TImage>
unsigned int
StreamingManager<TImage>::GetNumberOfSplits()
{
return m_ComputedNumberOfSplits;
}
template <class TImage>
typename StreamingManager<TImage>::RegionType
StreamingManager<TImage>::GetSplit(unsigned int i)
{
typename StreamingManager<TImage>::RegionType region( m_Region );
m_Splitter->GetSplit(i, m_ComputedNumberOfSplits, region);
return region;
}
} // End namespace otb
#endif
|