[Insight-users] Memory Allocation Error in Java
Evert van Velsen
efsvelse at students.cs.uu.nl
Wed Dec 15 18:57:38 EST 2004
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
>>>>
>>>>
>>>
>>>
>>>
>>>
>>>
>>
>>
>>
>
>
>
>
>
More information about the Insight-users
mailing list