8 hours ago, Harry Spier wrote: > I probably have to go the route you and others suggest. But I think > I still have a problem. Even the single operation of > MagickExportPIxels to export the pixel data of this page to > manipulate fills at least 4/7 of the memory before failure. And > there is no guarantee that pages wont have more pixel data. They > probably will. And as Matthias says the list doesn't seem "that > large".
It looks like `MagickExportPixels' is something similar to the deprecated `MagickGetImagePixels' -- so my guess is that you interfaced this function in a similar way to how the latter is done in ffi/examples/magick. If these guesses are all valid, then the important thing here is that there's no real need to convert the resulting block of memory to a list of lists -- you can just create a byte string of the appropriate size, then use it directly. For example, I added this: (defmagick* MagickExportImagePixels : _MagickWand (x : _long) (y : _long) (width : _ulong) (height : _ulong) (map : _string = "I") (storage-type : _StorageType = 'CharPixel) (block : _bytes = (make-bytes (* width height))) -> _status -> block) (It's a bad hack, since it calls the function `MagickExportImagePixels' but it really hard-wires the `map' and `storage-type' arguments...) With this, calling the function on an image returns a byte string with the intensities (which is also -- I'm guessing -- what you're looking for). Now you can use the resulting byte string as-is, and directly read its contents, manipulate it, and use it with other magick functions. This will save you on the redundant list allocation, and will keep a single copy instead of several copies. (And perhaps there's also some magick function that can do the same with a single bit/pixel to get the extra 8x saving factor.) > Also I have 4 or 5 transformation stages of the pixel data. Will > putting in Garbage Collection commands to get rid of transformations > of the data I've already used help? (My guess is that it won't help.) > What sets the amount of memory the Racket virtual machine uses. Is > it a Racket parameter, Is it a function of the amount of RAM in the > machine? Is this more a Windows problem and will switching to Linux > help etc.? If you're not using a 64 bit machine, then it might help to do that, but I'd put this in the same category of not worth fighting with, since you'll need some drastic changes anyway. -- ((lambda (x) (x x)) (lambda (x) (x x))) Eli Barzilay: http://barzilay.org/ Maze is Life! ____________________ Racket Users list: http://lists.racket-lang.org/users