Re: Memory when reding in data
- To: mathgroup at smc.vnet.net
- Subject: [mg121002] Re: Memory when reding in data
- From: David Bailey <dave at removedbailey.co.uk>
- Date: Sun, 21 Aug 2011 05:32:22 -0400 (EDT)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- References: <j2lehm$ngv$1@smc.vnet.net>
On 19/08/2011 11:39, Peter Rodenbach wrote: > Hi everyone. > > I am analysing image data and I have the problem that after about 50 > images or so Mathematica quits the calculation with the hint out of > memory. The interesting part of the code i wrote is : > > (*Import the first image into Maxvals, which will be compared to all \ > other images and overwritten if any point is found to be larger*) > > SetDirectory[ > "E:\\...]; > > Initialise = OpenRead["s2_260_0000.edf", BinaryFormat -> True]; > MaxValues = > BinaryRead["s2_260_0000.edf", > Table["UnsignedInteger16", {512}, {512}]]; > counter = Dimensions[MaxValues]; > > (*Load all experimental images and perform maximum projection*) > > MaxProjection[filename_] := {OpenRead[filename, BinaryFormat -> True], > Imagevalues = > BinaryRead[filename, Table["UnsignedInteger16", {512}, {512}]], > For[i = 1, i<= counter[[1]], i++, > For [j = 1, j<= counter[[2]], j++, > If[MaxValues[[i, j]]>= Imagevalues[[i, j]], > MaxValues[[i, j]] = MaxValues[[i, j]], > MaxValues[[i, j]] = Imagevalues[[i, j]]] > ] > ], Close[Imagevalues]} > > > MaxProjection[#]& /@ FileNames@"*edf" > > So I guess Mathm saves all the data of all the images after each > other. But once the comparision is done with the one MaxProjection > Image I want to have, all the data can be dumped from the memory and > then the next image can be compared with this MaxProjection image. > > Does anyone have an idea? Thx. > Your code looks wrong because you open each file with OpenRead and never close (or use) the stream it produces (I wonder if binary streams open a large buffer). Try something like this: strm=OpenRead[filename, BinaryFormat -> True]; Imagevalues=BinaryRead[strm, Table["UnsignedInteger16", {512}, {512}]]; .......... Close[strm] Notice that it is the stream that should be closed - not the data! Also, I would use Module to define functions, rather than just using a list of expressions { .......}. With a Module, you can specify certain variables, such as strm, to be local to the module, and also, you won't return a list of garbage as the result of the call - which could cause trouble if one of those objects is big! David Bailey http://www.dbaileyconsultancy.co.uk