[Insight-users] Memory Allocation Error in Java
Evert van Velsen
efsvelse at students.cs.uu.nl
Mon Dec 20 05:56:11 EST 2004
Hi Luis,
I've tried both solutions, and it worked for my 128x128x200 tiff stack,
both with and without the ShapeDetection filter.
But after that I tried it for another tiff stack of 128x128x300 and the
same memory allocation error occured. Even when I omitted the
ShapeDetection filter, and only the FastMarching filter was used.
Hope you can do something with this,
Evert
>
> Hi Evert
>
>
> Please try the following:
>
>
>
> 1) Temporarily remove the ShapeDetection filter from
> your code and check if the stages leading up to
> the FastMarching filter are still challenging the
> memory resources.
>
> This will help us to locate where the memory is
> being consumed.
>
>
>
>
> 2) Try invoking in all the filters the methods
>
>
> SetReleaseDataFlag( true );
>
>
> This flags forces a filter to release its output
> memory when it no longer needed by the downstream
> pipeline.
>
> So far, every filter in the pipeline is holding the
> memory of its output image, therefore accumulating
> more and more memory. Your images however, don't seem
> to be large enough for justifying a 2GB comsumption.
>
>
>
>
> Please let us know what you find.
>
>
>
> Thanks
>
>
>
> Luis
>
>
>
> -----------------------
> Evert van Velsen wrote:
>
>> Hi Luis and others,
>>
>> I used a tiff-stack of 128x128 with 200 slices with a 8-bit grayscale.
>> The
>> file is output of ImageJ.
>> Furthermore I will add my code of the ShapeDetectionLevelSet, so you can
>> see what I'm doing, and maybee see what's wrong with it.
>>
>> Thanks,
>>
>> Evert
>> ------------------------------Java Code----------------------------
>> itkBinaryThresholdImageFilterF3US3_Pointer thresholder =
>> itkBinaryThresholdImageFilterF3US3.itkBinaryThresholdImageFilterF3US3_New();
>> thresholder.SetLowerThreshold( -1000.0f );
>> thresholder.SetUpperThreshold( 0.0f );
>> thresholder.SetOutsideValue( 0 );
>> thresholder.SetInsideValue( 255 );
>>
>> itkImageFileReaderF3_Pointer reader =
>> itkImageFileReaderF3.itkImageFileReaderF3_New();
>> itkImageFileWriterUS3_Pointer writer =
>> itkImageFileWriterUS3.itkImageFileWriterUS3_New();
>> reader.SetFileName(path); //locatation of the input file
>> writer.SetFileName(directory+nameU); //output location
>>
>> itkCurvatureAnisotropicDiffusionImageFilterF3F3_Pointer
>> smoothing
>> =
>> itkCurvatureAnisotropicDiffusionImageFilterF3F3.itkCurvatureAnisotropicDiffusionImageFilterF3F3_New();
>> itkGradientMagnitudeRecursiveGaussianImageFilterF3F3_Pointer
>> gradientMagnitude =
>> itkGradientMagnitudeRecursiveGaussianImageFilterF3F3.itkGradientMagnitudeRecursiveGaussianImageFilterF3F3_New();
>> itkSigmoidImageFilterF3F3_Pointer sigmoid =
>> itkSigmoidImageFilterF3F3.itkSigmoidImageFilterF3F3_New();
>>
>> sigmoid.SetOutputMinimum( 0.0f );
>> sigmoid.SetOutputMaximum( 1.0f );
>>
>> itkFastMarchingImageFilterF3F3_Pointer fastMarching =
>> itkFastMarchingImageFilterF3F3.itkFastMarchingImageFilterF3F3_New();
>> itkShapeDetectionLevelSetImageFilterF3F3_Pointer shapeDetection =
>> itkShapeDetectionLevelSetImageFilterF3F3.itkShapeDetectionLevelSetImageFilterF3F3_New();
>> //pipeline:
>> smoothing.SetInput( reader.GetOutput() );
>> gradientMagnitude.SetInput( smoothing.GetOutput() );
>> sigmoid.SetInput( gradientMagnitude.GetOutput() );
>> fastMarching.SetInput(sigmoid.GetOutput());
>> shapeDetection.SetInput( fastMarching.GetOutput() );
>> shapeDetection.SetFeatureImage( sigmoid.GetOutput() );
>> thresholder.SetInput( shapeDetection.GetOutput() );
>> writer.SetInput( thresholder.GetOutput() );
>>
>> smoothing.SetTimeStep( 0.059 );
>> smoothing.SetNumberOfIterations( 5);
>> smoothing.SetConductanceParameter( 9 );
>>
>> double sigma = 1.0;
>> double alpha = -0.5;
>> double beta = 1.5;
>> gradientMagnitude.SetSigma( sigma );
>> sigmoid.SetAlpha( alpha );
>> sigmoid.SetBeta( beta );
>>
>> itkNodeContainerF3_Pointer seeds =
>> itkNodeContainerF3.itkNodeContainerF3_New();
>> itkIndex3 seedPosition = new itkIndex3();
>> itkLevelSetNodeF3 node = new itkLevelSetNodeF3();
>> float seedValue = -10f;
>>
>> seedPosition.SetElement(0,61); //x
>> seedPosition.SetElement(1,81); //y
>> seedPosition.SetElement(2,4); //z
>> node.SetValue( seedValue );
>> node.SetIndex( seedPosition);
>> seeds.Initialize();
>> seeds.InsertElement(0,node);
>>
>> fastMarching.SetTrialPoints( seeds.GetPointer() );
>> fastMarching.SetSpeedConstant( 1.0 );
>> fastMarching.SetOutputSize(reader.GetOutput().GetBufferedRegion().GetSize()
>> );
>>
>> float curvatureScaling = 2.5f;
>> float propagationScaling = 2.5f;
>>
>> shapeDetection.SetPropagationScaling( propagationScaling );
>> shapeDetection.SetCurvatureScaling( curvatureScaling );
>> shapeDetection.SetMaximumRMSError( 0.02 );
>> shapeDetection.SetNumberOfIterations( 800 );
>>
>> try
>> {
>> writer.Update();
>> }
>> catch(Exception e)
>> {
>> NJ.write("Error: "+ e);
>> }
>> ---------------end of code----------------------------
>>
>>
>>
>>>Hi Evert,
>>>
>>>Thanks for trying the command line options for java.
>>>
>>>
>>>
>>>It is now time for "Plan B".
>>>
>>>
>>>
>>>The question to answer is:
>>>
>>> What are you doing in your pipeline that
>>> is taking so much memory (more than 1 Gb). ?
>>>
>>>
>>>
>>>Please give us a list of:
>>>
>>>
>>>- The filters that you connected in your pipeline,
>>>
>>>- The size (in pixels) of the input image,
>>>
>>>- The pixel type that you are using for instantiating
>>> each one of the intermediate filters.
>>>
>>>
>>>
>>>One thing that you may want to try is to enable the
>>>ReleaseDataFlag() in all the filters in your pipeline.
>>>This flag allows you to release memory of the filter
>>>as their Update() progress in the pipeline. In this
>>>way you discard memory that is no longer needed.
>>>
>>>
>>>Please let us know about the information in the list
>>>above.
>>>
>>>
>>> Thanks
>>>
>>>
>>>
>>> Luis
>>>
>>>
>>>
>>>-----------------------
>>>Evert van Velsen wrote:
>>>
>>>
>>>>Hi Luis,
>>>>
>>>>the fist two options you proposed, didn't help unfortunately. The
>>>>memmory
>>>>usage was already at it max; even 1GB :S
>>>>Also I tried to adapt line 186 into the following:
>>>>throw MemoryAllocationError(__FILE__, __LINE__, "Failed to allocate
>>>>memory
>>>>for image: "+size,"ImportImageContainer::AllocateElements");
>>>>But the whole program crashed.
>>>>
>>>>Do you have any other solutions to see how much memory had to be
>>>>allocated?
>>>>Otherwise I had to sepparate my ImageStack into subsamples I think.
>>>>
>>>>Thanks,
>>>>
>>>>Evert
>>>>
>>>>
>>>>
>>>>
>>>>>Hi Evert,
>>>>>
>>>>>The Java virtual machine has a natural limitation to the amount
>>>>>of memory made available its processes.
>>>>>
>>>>> http://java.sun.com/docs/hotspot/gc5.0/ergo5.html
>>>>>
>>>>>You may want to first attempt to increase the memory made available
>>>>>to your program by the virtual machine.
>>>>>
>>>>>http://java.sun.com/j2se/1.5.0/docs/tooldocs/solaris/java.html
>>>>>
>>>>>This can be done with the command line options for the "java"
>>>>>command:
>>>>>
>>>>>" -Xmsn
>>>>>
>>>>> Specify the initial size, in bytes, of the memory allocation pool.
>>>>>This value must be a multiple of 1024 greater than 1MB. Append the
>>>>>letter k or K to indicate kilobytes, or m or M to indicate megabytes.
>>>>>The default value is 2MB. Examples:
>>>>>
>>>>> -Xms6291456
>>>>> -Xms6144k
>>>>> -Xms6m
>>>>>
>>>>>
>>>>>-Xmxn
>>>>> Specify the maximum size, in bytes, of the memory allocation pool.
>>>>>This value must a multiple of 1024 greater than 2MB. Append the letter
>>>>> k
>>>>>or K to indicate kilobytes, or m or M to indicate megabytes. The
>>>>> default
>>>>>value is 64MB. Examples:
>>>>>
>>>>> -Xmx83886080
>>>>> -Xmx81920k
>>>>> -Xmx80m
>>>>>
>>>>>"
>>>>>
>>>>>
>>>>>
>>>>>If you still find memory allocation problems, you may want to add a
>>>>>message to the file:
>>>>>
>>>>> Insight/Code/Common/itkImportImageContainer.txx
>>>>>
>>>>>in line 186 in order to specify how much memory is trying to allocate.
>>>>>
>>>>>It is likely that some of the signed/unsigned convertions from Java to
>>>>>C++ is creating a situation where an obscene amount of memory is being
>>>>>requested for an image.
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>Please let us know what you find.
>>>>>
>>>>>
>>>>> Thanks
>>>>>
>>>>>
>>>>>
>>>>> Luis
>>>>>
>>>>>
>>>>>
>>>>>------------------------
>>>>>Evert van Velsen wrote:
>>>>>
>>>>>
>>>>>
>>>>>>Hi there,
>>>>>>
>>>>>>when running my java-written ITK program, which I've combined with
>>>>>>ImageJ,
>>>>>>I received the following error:
>>>>>>Error: java.lang.RuntimeException:
>>>>>>c:\insighttoolkit-1.8.1\code\common\itkImportImageContainer.txx:186:Failed
>>>>>>to allocate memory for image.
>>>>>>
>>>>>>The input of the program is a 200 slice 3d-image (tiff-format) of
>>>>>>128x128,
>>>>>>and the error occured when performing the
>>>>>> ShapeDetectionLevelSetFilter
>>>>>>with 200 seedpoints (one on each slice).
>>>>>>I'm using ITK 1.8.1 with java 1.4.2_05
>>>>>>
>>>>>>Does anyone know how I can fix this problem?
>>>>>>
>>>>>>Thanks,
>>>>>>
>>>>>>Evert
>>>>>>_______________________________________________
>>>>>>Insight-users mailing list
>>>>>>Insight-users at itk.org
>>>>>>http://www.itk.org/mailman/listinfo/insight-users
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>
>>>
>>>
>>>
>>
>> _______________________________________________
>> Insight-users mailing list
>> Insight-users at itk.org
>> http://www.itk.org/mailman/listinfo/insight-users
>>
>>
>
>
>
>
>
More information about the Insight-users
mailing list