[ITK-users] [ITK] How to make ITK-binaries NOT ignore kernel out of memory messages?
Dr. Roman Grothausmann
grothausmann.roman at mh-hannover.de
Wed Jul 16 09:06:05 EDT 2014
Hi Matt,
Many thanks for Your reply. I'll check if ITK_GLOBAL_DEFAULT_NUMBER_OF_THREADS=1
prevents the problems. Although I'd be astonished if it does because
BinaryMask3DMeshSource seems to use only one core anyway.
Thanks again for Your help
Roman
On 15/07/14 02:55, Matt McCormick wrote:
> Hi Roman,
>
> The CMake configuration variable:
>
> ITK_COMPUTER_MEMORY_SIZE
>
> is only used to choose which unit tests to run, and has no effect on
> your program.
>
>
> It may be worth a try to run
>
> export ITK_GLOBAL_DEFAULT_NUMBER_OF_THREADS=1
>
> before starting your program on the server to see the effect. It is
> possible that too many threads or being spawned or that the amount of
> memory consumed is scaling (poorly) with the number of threads used.
>
> Hope this helps,
> Matt
>
> On Mon, Jun 23, 2014 at 6:36 AM, Dr. Roman Grothausmann
> <grothausmann.roman at mh-hannover.de> wrote:
>> Dear Luis,
>>
>>
>> Many thanks for Your reply. It took me some time to reproduce the problem,
>> because Your test program works as expected on our server:
>>
>> ~$ ~/itk/simple/build_itk-4.5.1/memtest_01 1000
>> ITK Hello World !
>>
>> ~$ ~/itk/simple/build_itk-4.5.1/memtest_01 10000
>> /opt/itk-4.5.1/include/ITK-4.5/itkImportImageContainer.hxx:192:
>>
>> Failed to allocate memory for image.
>>
>> One program of mine for which the problem exists is below. The problem
>> occurs when BinaryMask3DMeshSource acquires more memory after running for
>> some minutes. The very strange thing to me is, that the program is killed by
>> the kernel as expected on my desktop PC:
>>
>> ~/itk/simple/build_itk4_pc3G48243/euler-characteristic_01 13-511_EAA_ot.mha
>> 255
>> component type is: unsigned_char
>> numDimensions: 3
>> component size: 1
>> pixel type (string): scalar
>> pixel type: 1
>> _________________________
>>
>> Executing ImageFileReader done. Took 2.78 seconds.
>> Executing BinaryMask3DMeshSource Killed
>>
>>
>> The header of 13-511_EAA_ot.mha:
>>
>> ObjectType = Image
>> NDims = 3
>> BinaryData = True
>> BinaryDataByteOrderMSB = False
>> CompressedData = True
>> CompressedDataSize = 20474538
>> TransformMatrix = 1 0 0 0 1 0 0 0 1
>> Offset = 0 0 0
>> CenterOfRotation = 0 0 0
>> AnatomicalOrientation = RAI
>> ElementSpacing = 1 1 1
>> DimSize = 998 998 1034
>> ElementType = MET_UCHAR
>> ElementDataFile = LOCAL
>>
>>
>> However on the server it is not terminated when the RAM runs out, instead
>> many processes go nuts that had been mostly sleeping and finally the system
>> does not respond any more at all and a cold start is necessary. The
>> itk-4.5.1 is configured on the server with (see attached
>> CMakeCache_itk-4.5.1.txt):
>>
>> ITK_COMPUTER_MEMORY_SIZE 190
>>
>> The server has 256GB of RAM an no Swap enabled:
>>
>> free
>> total used free shared buffers cached
>> Mem: 264498496 1341020 263157476 0 285760 289120
>> -/+ buffers/cache: 766140 263732356
>> Swap: 0 0 0
>>
>>
>> Has 12x2 Intel(R) Xeon(R) CPUs:
>>
>> cat /proc/cpuinfo
>> processor : 0
>> vendor_id : GenuineIntel
>> cpu family : 6
>> model : 45
>> model name : Intel(R) Xeon(R) CPU E5-2630L 0 @ 2.00GHz
>> stepping : 7
>> microcode : 0x710
>> cpu MHz : 1200.000
>> cache size : 15360 KB
>> physical id : 0
>> siblings : 12
>> core id : 0
>> cpu cores : 6
>> apicid : 0
>> initial apicid : 0
>> fpu : yes
>> fpu_exception : yes
>> cpuid level : 13
>> wp : yes
>> flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca
>> cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx
>> pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology
>> nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2
>> ssse3 cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer
>> aes xsave avx lahf_lm ida arat epb xsaveopt pln pts dtherm tpr_shadow vnmi
>> flexpriority ept vpid
>> bogomips : 4000.56
>> clflush size : 64
>> cache_alignment : 64
>> address sizes : 46 bits physical, 48 bits virtual
>> power management:
>> .
>> .
>> .
>>
>>
>> The server runs a Debian Wheezy (7.2):
>> uname -a
>> Linux img1-serv 3.2.0-4-amd64 #1 SMP Debian 3.2.57-3+deb7u2 x86_64 GNU/Linux
>>
>> My desktop PC has the same Debian (also same update state):
>> uname -a
>> Linux pc3G48243 3.2.0-4-amd64 #1 SMP Debian 3.2.57-3+deb7u2 x86_64 GNU/Linux
>>
>> free
>> total used free shared buffers cached
>> Mem: 8180356 1185364 6994992 0 23348 216084
>> -/+ buffers/cache: 945932 7234424
>> Swap: 0 0 0
>>
>>
>> and 4 AMD FX(tm)-4100 Quad-Core Processors:
>>
>> cat /proc/cpuinfo
>> processor : 0
>> vendor_id : AuthenticAMD
>> cpu family : 21
>> model : 1
>> model name : AMD FX(tm)-4100 Quad-Core Processor
>> stepping : 2
>> microcode : 0x6000626
>> cpu MHz : 1400.000
>> cache size : 2048 KB
>> physical id : 0
>> siblings : 4
>> core id : 0
>> cpu cores : 2
>> apicid : 16
>> initial apicid : 0
>> fpu : yes
>> fpu_exception : yes
>> cpuid level : 13
>> wp : yes
>> flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca
>> cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt
>> pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc extd_apicid
>> aperfmperf pni pclmulqdq monitor ssse3 cx16 sse4_1 sse4_2 popcnt aes xsave
>> avx lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse
>> 3dnowprefetch osvw ibs xop skinit wdt lwp fma4 nodeid_msr topoext
>> perfctr_core arat cpb hw_pstate npt lbrv svm_lock nrip_save tsc_scale
>> vmcb_clean flushbyasid decodeassists pausefilter pfthreshold
>> bogomips : 7233.41
>> TLB size : 1536 4K pages
>> clflush size : 64
>> cache_alignment : 64
>> address sizes : 48 bits physical, 48 bits virtual
>> power management: ts ttp tm 100mhzsteps hwpstate [9]
>>
>>
>> Knowing now, that itk checks for available RAM, the only sources for this
>> problem I can think of would be an odd configuration of ITK itself or its
>> use in programs compiled on the server, or some configuration differences in
>> the (Debian) system, or some hardware problem.
>>
>> Do You have any idea what it could be?
>> Or do You have any suggestions how I should go on searching for the cause?
>>
>>
>> Any help or hints are very much appriciated.
>> Many thanks for Your help again!
>>
>> Roman
>>
>>
>> _____________________________________________
>>
>>
>>
>> ////program to calculate the Euler characteristic of a binary image
>> converted to itkQuadEdgeMesh
>> ////THEREFORE does NOT take filled regions into account only covering
>> surfaces!
>> ////if fillings should be accounted use instead a vtk program taking 3D
>> cells into account
>>
>>
>>
>> #include <itkImageFileReader.h>
>> //#include <itkImage.h>
>> #include <itkBinaryMask3DMeshSource.h> //itk marching cubes (mc) very slow
>> and resource hungry :-(
>> #include <itkQuadEdgeMeshTopologyChecker.h>
>> #include <itkQuadEdgeMeshBoundaryEdgesMeshFunction.h>
>>
>>
>>
>> #include "itkFilterWatcher2.h"
>>
>>
>>
>>
>> void dispatch_cT(itk::ImageIOBase::IOPixelType,
>> itk::ImageIOBase::IOComponentType, size_t, int, char **);
>>
>> template<typename InputComponentType>
>> void dispatch_pT(itk::ImageIOBase::IOPixelType pixelType, size_t, int, char
>> **);
>>
>> template<typename InputComponentType, typename InputPixelType>
>> void dispatch_D(size_t, int, char **);
>>
>> template<typename InputComponentType, typename InputPixelType, size_t
>> Dimension>
>> int DoIt(int, char *argv[]);
>>
>>
>>
>>
>>
>> template<typename InputComponentType, typename InputPixelType, size_t
>> Dimension>
>> int DoIt(int argc, char *argv[]){
>>
>> typedef InputPixelType OutputPixelType;
>>
>> typedef itk::Image<InputPixelType, Dimension> InputImageType;
>> typedef itk::Image<OutputPixelType, Dimension> OutputImageType;
>>
>>
>> typedef itk::ImageFileReader<InputImageType> ReaderType;
>> typename ReaderType::Pointer reader = ReaderType::New();
>>
>> reader->SetFileName(argv[1]);
>> FilterWatcher watcherI(reader, "reading");
>> watcherI.QuietOn();
>> watcherI.ReportTimeOn();
>> try
>> {
>> reader->Update();
>> }
>> catch (itk::ExceptionObject &ex)
>> {
>> if (!strcmp(ex.GetDescription(), "Filter does not have progress.")){
>> std::cerr << ex.GetDescription() << std::endl;
>> return EXIT_FAILURE;
>> }
>> }
>>
>>
>> typedef double CoordType;
>>
>> //typedef itk::Mesh<CoordType> MeshType;
>> typedef itk::QuadEdgeMesh<CoordType, Dimension> InputMeshType;
>>
>> const InputPixelType isoValue= static_cast<InputPixelType>(atof(argv[2]));
>>
>> typedef itk::BinaryMask3DMeshSource<InputImageType, InputMeshType>
>> MeshSourceType;
>> typename MeshSourceType::Pointer meshSource = MeshSourceType::New();
>>
>> meshSource->SetInput(reader->GetOutput());
>> meshSource->SetObjectValue(isoValue);
>>
>> FilterWatcher watcher(meshSource, "BinaryMask3DMeshSource");
>> watcher.QuietOn();
>> watcher.ReportTimeOn();
>> try
>> {
>> meshSource->Update();
>> }
>> catch (itk::ExceptionObject &ex)
>> {
>> if (!strcmp(ex.GetDescription(), "Filter does not have progress.")){
>> std::cerr << ex.GetDescription() << std::endl;
>> return EXIT_FAILURE;
>> }
>> }
>>
>>
>> std::cout << "Nodes = " << meshSource->GetNumberOfNodes() << std::endl;
>> std::cout << "Cells = " << meshSource->GetNumberOfCells() << std::endl;
>>
>> typename InputMeshType::Pointer mesh= meshSource->GetOutput();
>>
>> //// check if meshSource can be represented as an itkQuadEdgeMesh
>> //// if BinaryMask3DMeshSource caps boundary surfaces this check is not
>> necessary!
>>
>> typedef itk::QuadEdgeMeshTopologyChecker<InputMeshType> TQEchecker;
>> typename TQEchecker::Pointer QEchecker = TQEchecker::New();
>> QEchecker->SetMesh(mesh);
>> std::cerr << "Executing
>> QuadEdgeMeshTopologyChecker->ValidateEulerCharacteristic()";
>> if(!QEchecker->ValidateEulerCharacteristic()){
>> std::cerr << "Not a valid QuadEdgeMesh! Aborting." << std::endl;
>> return EXIT_FAILURE;
>> }
>> std::cerr << " done." << std::endl;
>>
>> //// calc Euler characteristics \xi
>> //// For closed smooth manifolds, the Euler characteristic coincides with
>> the Euler number:
>> http://en.wikipedia.org/wiki/Euler_characteristic#Relations_to_other_invariants
>> //// general formula see:
>> http://en.wikipedia.org/wiki/Genus_%28mathematics%29#Orientable_surface
>> ////
>> ////
>> ////
>> //// good QuadEdge explanation:
>> http://www.cs.cmu.edu/afs/andrew/scs/cs/15-463/2001/pub/src/a2/quadedge.html
>> /// from itkQuadEdgeMeshTopologyChecker.hxx
>>
>> typedef itk::QuadEdgeMeshBoundaryEdgesMeshFunction<InputMeshType>
>> BoundaryEdges;
>>
>> typename BoundaryEdges::Pointer boundaryEdges = BoundaryEdges::New();
>>
>> // Number of USED points
>> typedef typename InputMeshType::PointIdentifier
>> PointIdentifier;
>> std::cerr << "ComputeNumberOfPoints";
>> PointIdentifier numPoints = mesh->ComputeNumberOfPoints();
>> std::cerr << " done." << std::endl;
>> // Number of USED edges
>> typedef typename InputMeshType::CellIdentifier
>> CellIdentifier;
>> std::cerr << "ComputeNumberOfEdges";
>> CellIdentifier numEdges = mesh->ComputeNumberOfEdges();
>> std::cerr << " done." << std::endl;
>> // Number of USED faces
>> std::cerr << "ComputeNumberOfFaces";
>> CellIdentifier numFaces = mesh->ComputeNumberOfFaces();
>> std::cerr << " done." << std::endl;
>> // Number of Boundaries
>> std::cerr << "ComputeNumberOfBoundaryEdges";
>> typename BoundaryEdges::OutputType
>> listOfBoundaries = boundaryEdges->Evaluate((*mesh));
>> std::cerr << " done." << std::endl;
>> CellIdentifier numBounds = listOfBoundaries->size();
>> delete listOfBoundaries;
>>
>> /**
>> * Number of points
>> *
>> * There are two methods to get the number of points.
>> * 1. itk::QuadEdgeMesh::ComputeNumberOfPoints()
>> * 2. itk::Mesh::GetNumberOfPoints()
>> *
>> * As an itk::QuadEdgeMesh is an itk::Mesh by inheritance, the user
>> * can use both. 1. will returned the number of points actually
>> * used by at least one edge, while 2. will give you the number
>> * of points in the container. Number of unused points can be found
>> * by making the difference between the two values.
>> */
>> if(mesh->GetNumberOfPoints() != numPoints){
>> std::cerr << "There are isolated vertices! Aborting." << std::endl;
>> return EXIT_FAILURE;
>> }
>>
>> // The euler formula states:
>> // numFaces - numEdges + numPoints == 2 - 2 * genus - numBounds == \xi
>> // hence 2 * genus= 2 - numBounds - numFaces + numEdges - numPoints must
>> be an oddeven number.
>>
>> typedef ::itk::OffsetValueType OffsetValueType;
>>
>> OffsetValueType xi=
>> + OffsetValueType(numFaces)
>> - OffsetValueType(numEdges)
>> + OffsetValueType(numPoints);
>>
>> std::cout << "The Euler characteristic Xi is: " << xi << std::endl;
>>
>> OffsetValueType twiceGenus=
>> + OffsetValueType(2) - OffsetValueType(numBounds)
>> - xi;
>>
>> std::cout << "The genus is: " << twiceGenus/OffsetValueType(2) <<
>> std::endl;
>>
>> return EXIT_SUCCESS;
>>
>> }
>>
>>
>> void dispatch_cT(itk::ImageIOBase::IOComponentType componentType,
>> itk::ImageIOBase::IOPixelType pixelType, size_t dimensionType, int argc,
>> char *argv[]){
>>
>>
>> //http://www.itk.org/Doxygen45/html/classitk_1_1ImageIOBase.html#a8dc783055a0af6f0a5a26cb080feb178
>> //http://www.itk.org/Doxygen45/html/itkImageIOBase_8h_source.html#l00107
>> //IOComponentType: UNKNOWNCOMPONENTTYPE, UCHAR, CHAR, USHORT, SHORT, UINT,
>> INT, ULONG, LONG, FLOAT, DOUBLE
>>
>> switch (componentType){
>> case itk::ImageIOBase::UCHAR:{
>> typedef unsigned char InputComponentType;
>> dispatch_pT<InputComponentType>(pixelType, dimensionType, argc, argv);
>> }
>> break;
>> case itk::ImageIOBase::CHAR:{
>> typedef char InputComponentType;
>> dispatch_pT<InputComponentType>(pixelType, dimensionType, argc, argv);
>> }
>> break;
>> case itk::ImageIOBase::USHORT:{
>> typedef unsigned short InputComponentType;
>> dispatch_pT<InputComponentType>(pixelType, dimensionType, argc, argv);
>> }
>> break;
>> case itk::ImageIOBase::SHORT:{
>> typedef short InputComponentType;
>> dispatch_pT<InputComponentType>(pixelType, dimensionType, argc, argv);
>> }
>> break;
>> case itk::ImageIOBase::UINT:{
>> typedef unsigned int InputComponentType;
>> dispatch_pT<InputComponentType>(pixelType, dimensionType, argc, argv);
>> }
>> break;
>> case itk::ImageIOBase::INT:{
>> typedef int InputComponentType;
>> dispatch_pT<InputComponentType>(pixelType, dimensionType, argc, argv);
>> }
>> break;
>> // case itk::ImageIOBase::ULONG:{
>> // typedef unsigned long InputComponentType;
>> // dispatch_pT<InputComponentType>(pixelType, dimensionType, argc,
>> argv);
>> // }
>> // break;
>> // case itk::ImageIOBase::LONG:{
>> // typedef long InputComponentType;
>> // dispatch_pT<InputComponentType>(pixelType, dimensionType, argc,
>> argv);
>> // }
>> // break;
>> // case itk::ImageIOBase::FLOAT:{
>> // typedef float InputComponentType;
>> // dispatch_pT<InputComponentType>(pixelType, dimensionType, argc,
>> argv);
>> // }
>> // break;
>> // case itk::ImageIOBase::DOUBLE:{
>> // typedef double InputComponentType;
>> // dispatch_pT<InputComponentType>(pixelType, dimensionType, argc,
>> argv);
>> // }
>> // break;
>> case itk::ImageIOBase::UNKNOWNCOMPONENTTYPE:
>> default:
>> std::cout << "unknown component type" << std::endl;
>> break;
>> }//switch
>> }
>>
>> template<typename InputComponentType>
>> void dispatch_pT(itk::ImageIOBase::IOPixelType pixelType, size_t
>> dimensionType, int argc, char *argv[]){
>>
>>
>> //http://www.itk.org/Doxygen45/html/classitk_1_1ImageIOBase.html#abd189f096c2a1b3ea559bc3e4849f658
>> //http://www.itk.org/Doxygen45/html/itkImageIOBase_8h_source.html#l00099
>> //IOPixelType:: UNKNOWNPIXELTYPE, SCALAR, RGB, RGBA, OFFSET, VECTOR,
>> POINT, COVARIANTVECTOR, SYMMETRICSECONDRANKTENSOR, DIFFUSIONTENSOR3D,
>> COMPLEX, FIXEDARRAY, MATRIX
>>
>> switch (pixelType){
>> case itk::ImageIOBase::SCALAR:{
>> typedef InputComponentType InputPixelType;
>> //typedef itk::SCALARPixel<InputComponentType> InputPixelType;
>> dispatch_D<InputComponentType, InputPixelType>(dimensionType, argc,
>> argv);
>> }
>> break;
>> // case itk::ImageIOBase::RGB:{
>> // typedef itk::RGBPixel<InputComponentType> InputPixelType;
>> // dispatch_D<InputComponentType, InputPixelType>(dimensionType, argc,
>> argv);
>> // }
>> // break;
>> // case itk::ImageIOBase::RGBA:{
>> // typedef itk::RGBAPixel<InputComponentType> InputPixelType;
>> // dispatch_D<InputComponentType, InputPixelType>(dimensionType, argc,
>> argv);
>> // }
>> // break;
>> // case itk::ImageIOBase::VECTOR:{
>> // //typedef itk::VECTORPixel<InputComponentType> InputPixelType; //does
>> not work!
>> // typedef itk::VariableLengthVector<InputComponentType> InputPixelType;
>> // dispatch_D<InputComponentType, InputPixelType>(dimensionType, argc,
>> argv);
>> // }
>> // break;
>> case itk::ImageIOBase::UNKNOWNPIXELTYPE:
>> default:
>> std::cout << "unknown pixel type" << std::endl;
>> break;
>> }//switch
>> }
>>
>>
>> template<typename InputComponentType, typename InputPixelType>
>> void dispatch_D(size_t dimensionType, int argc, char *argv[]){
>> switch (dimensionType){
>> // case 1:
>> // DoIt<InputComponentType, InputPixelType, 1>(argc, argv);
>> // break;
>> // case 2:
>> // DoIt<InputComponentType, InputPixelType, 2>(argc, argv);
>> // break;
>> case 3:
>> DoIt<InputComponentType, InputPixelType, 3>(argc, argv);
>> break;
>> case 4:
>> DoIt<InputComponentType, InputPixelType, 3>(argc, argv);
>> break;
>> case 5:
>> DoIt<InputComponentType, InputPixelType, 3>(argc, argv);
>> break;
>> default:
>> std::cout << "Images of dimension " << dimensionType << " are not
>> supported!" << std::endl;
>> break;
>> }
>> }
>>
>>
>>
>> ////from
>> http://itk-users.7.n7.nabble.com/Pad-image-with-0-but-keep-its-type-what-ever-it-is-td27442.html
>> //namespace itk{
>> // Description:
>> // Get the PixelType and ComponentType from fileName
>>
>> void GetImageType (std::string fileName,
>> itk::ImageIOBase::IOPixelType &pixelType,
>> itk::ImageIOBase::IOComponentType &componentType,
>> size_t &dimensionType
>> //ImageIOBase::IODimensionType &dimensionType
>> ){
>> typedef itk::Image<unsigned char, 3> ImageType;
>> itk::ImageFileReader<ImageType>::Pointer imageReader=
>> itk::ImageFileReader<ImageType>::New();
>> imageReader->SetFileName(fileName.c_str());
>> imageReader->UpdateOutputInformation();
>>
>> pixelType = imageReader->GetImageIO()->GetPixelType();
>> componentType = imageReader->GetImageIO()->GetComponentType();
>> dimensionType= imageReader->GetImageIO()->GetNumberOfDimensions();
>>
>> //std::cerr << "Pixel Type is " <<
>> imageReader->GetImageIO()->GetComponentTypeAsString(pixelType) << std::endl;
>> std::cerr << "component type is: " <<
>> imageReader->GetImageIO()->GetComponentTypeAsString(componentType) <<
>> std::endl;
>> std::cerr << "numDimensions: " << dimensionType << std::endl;
>> std::cerr << "component size: " <<
>> imageReader->GetImageIO()->GetComponentSize() << std::endl;
>> std::cerr << "pixel type (string): " <<
>> imageReader->GetImageIO()->GetPixelTypeAsString(imageReader->GetImageIO()->GetPixelType())
>> << std::endl;
>> std::cerr << "pixel type: " << pixelType << std::endl <<
>> "_________________________" << std::endl << std::endl;
>>
>>
>> }
>>
>>
>>
>> int main(int argc, char *argv[]){
>> if ( argc != 3 )
>> {
>> std::cerr << "Missing Parameters: "
>> << argv[0]
>> << " Input_Image"
>> << " isoValue"
>> << std::endl;
>>
>> return EXIT_FAILURE;
>> }
>>
>> std::string ifn = argv[1];
>> // std::string ofn = argv[2];
>> // int compress= atoi(argv[3]);
>>
>> itk::ImageIOBase::IOPixelType pixelType;
>> typename itk::ImageIOBase::IOComponentType componentType;
>> //itk::ImageIOBase::IOComponentType componentType1;
>> //itk::ImageIOBase::IODimensionType dimensionType1;
>> size_t dimensionType;
>>
>>
>> try
>> {
>> GetImageType(argv[1], pixelType, componentType, dimensionType);
>>
>> dispatch_cT(componentType, pixelType, dimensionType, argc, argv);
>> }//try
>> catch( itk::ExceptionObject &excep)
>> {
>> std::cerr << argv[0] << ": exception caught !" << std::endl;
>> std::cerr << excep << std::endl;
>> return EXIT_FAILURE;
>> }
>>
>> return EXIT_SUCCESS;
>>
>> }
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> On 08/06/14 15:51, Luis Ibanez wrote:
>>>
>>>
>>> Roman,
>>>
>>>
>>> Could you please share with the list an example
>>> of a program where you are observing this behavior ?
>>>
>>> In particular, we would like to see if this is occurring with
>>> Image filters, or rather with other types of ITK objects.
>>>
>>>
>>>
>>> The itk::Image does listen to the (potential) memory allocation messages
>>> (that is, the bad_alloc exception).
>>>
>>>
>>>
>>> The itk::Image class uses a helper class to store the pixel data.
>>>
>>>
>>>
>>> This helper is the:
>>>
>>> itk::ImportImageContainer
>>>
>>>
>>> https://github.com/InsightSoftwareConsortium/ITK/blob/master/Modules/Core/Common/include/itkImportImageContainer.h
>>>
>>>
>>>
>>>
>>> and its memory allocation is typically done in the AllocateElements()
>>> function
>>> in line:
>>>
>>>
>>> https://github.com/InsightSoftwareConsortium/ITK/blob/master/Modules/Core/Common/include/itkImportImageContainer.hxx#L173
>>>
>>> the code looks like
>>>
>>> TElement *data;
>>>
>>> try
>>> {
>>> if ( UseDefaultConstructor )
>>> {
>>> data = new TElement[size](); //POD types initialized to 0, others
>>> use
>>> default constructor.
>>> }
>>> else
>>> {
>>> data = new TElement[size]; //Faster but uninitialized
>>> }
>>> }
>>> catch ( ... )
>>> {
>>> data = ITK_NULLPTR;
>>> }
>>> if ( !data )
>>> {
>>> // We cannot construct an error string here because we may be out
>>> // of memory. Do not use the exception macro.
>>> throw MemoryAllocationError(__FILE__, __LINE__,
>>> "Failed to allocate memory for image.",
>>> ITK_LOCATION);
>>> }
>>> return data;
>>>
>>>
>>>
>>> As you can see, the case of exceptions is managed in that function.
>>>
>>>
>>> Here is an example of a test program demonstrating that ITK image
>>> will throw exceptions when allocating memory beyond limits.
>>>
>>>
>>> #include "itkImage.h"
>>> #include <iostream>
>>>
>>> int main(int argc, char * argv[] )
>>> {
>>> if( argc < 2 )
>>> {
>>> std::cerr << "Missing arguments" << std::endl;
>>> return 1;
>>> }
>>>
>>> typedef itk::Image< unsigned short, 3 > ImageType;
>>>
>>> ImageType::Pointer image = ImageType::New();
>>>
>>> ImageType::RegionType region;
>>> ImageType::SizeType size;
>>>
>>> size_t side = atoi( argv[1] );
>>>
>>> size[0] = side;
>>> size[1] = side;
>>> size[2] = side;
>>>
>>> region.SetSize( size );
>>>
>>> image->SetRegions( region );
>>>
>>> try
>>> {
>>> image->Allocate();
>>> }
>>> catch( std::exception & excp )
>>> {
>>> std::cerr << excp.what() << std::endl;
>>> return 1;
>>> }
>>>
>>> std::cout << "ITK Hello World !" << std::endl;
>>>
>>> return 0;
>>> }
>>>
>>>
>>> and what happens when executing in an Ubuntu Linux machine with 32GB or
>>> RAM
>>>
>>>
>>> $ ./HelloWorld 1000
>>> ITK Hello World !
>>>
>>>
>>> $ ./HelloWorld 1000000
>>>
>>> /home/ibanez/src/ITK/Modules/Core/Common/include/itkImportImageContainer.hxx:199:
>>> Failed to allocate memory for image.
>>>
>>>
>>>
>>>
>>> Please share with the list a minimal example of the problem you are
>>> observing,
>>> and in this way we will be able to help track the issue.
>>>
>>>
>>> Thanks
>>>
>>>
>>> Luis
>>>
>>>
>>
>> --
>> Dr. Roman Grothausmann
>>
>> Tomographie und Digitale Bildverarbeitung
>> Tomography and Digital Image Analysis
>>
>> Institut für Funktionelle und Angewandte Anatomie, OE 4120
>> Medizinische Hochschule Hannover
>> Carl-Neuberg-Str. 1
>> D-30625 Hannover
>>
>> Tel. +49 511 532-9574
>>
>> _____________________________________
>> Powered by www.kitware.com
>>
>> Visit other Kitware open-source projects at
>> http://www.kitware.com/opensource/opensource.html
>>
>> Kitware offers ITK Training Courses, for more information visit:
>> http://www.kitware.com/products/protraining.php
>>
>> Please keep messages on-topic and check the ITK FAQ at:
>> http://www.itk.org/Wiki/ITK_FAQ
>>
>> Follow this link to subscribe/unsubscribe:
>> http://public.kitware.com/mailman/listinfo/insight-users
>>
--
Dr. Roman Grothausmann
Tomographie und Digitale Bildverarbeitung
Tomography and Digital Image Analysis
Institut für Funktionelle und Angewandte Anatomie, OE 4120
Medizinische Hochschule Hannover
Carl-Neuberg-Str. 1
D-30625 Hannover
Tel. +49 511 532-9574
More information about the Insight-users
mailing list