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!