How to access memory-mapped image files (eg, using a NIF)?

The Magick Persistent Cache (MPC) is a memory-mapped file of pixels, used to store image data. ImageMagick maps this into memory, then accesses desired sets of pixels by indexing into the array. Each array element contains a single-precision (32 bit) float for each channel (eg, R, G, B, A).

I’d like to do something similar in Elixir. I assume that I could use a NIF to handle the memory mapping and binary pattern matching to access the pixels, but I’m clueless about the details. Might anyone have a clue (or better, code) to do this sort of thing?

-r

There’s a chance you get this with OTP 21. They’re moving the file and network io over to NIFs. Try and see if OTP 21’s File.open supports what you’re looking for. Although, I suspect they’re shooting for feature parity, and not added functionality for this release.

In OTP 20 you’d find the data you care about, (or whole file) read that into iodata, then File.open the iodata as ram. That should give a FD for additional File based calls. However, I think you’re still operating in memory at this point without transparent disk syncing. When you’re done with your memory FD copy, you’d write the iodata back out to disk yourself.

Or…you can write your own NIF based io subsystem. Nifsy (https://github.com/ericentin/nifsy) exists. Doesn’t directly support mmap’d files, but does show how a NIF based IO library can be written.

3 Likes