Question

I'm looking for a simple way to save to and load from a file a 3D boost::multi_array. As far as I know there is no methods in the Boost library which I find odd.

I don't need the file to be human readable, so a binary file would be better for performance. Can anyone point me to a ready-made solution or give me ideas on how to implement such read/write methods ?

I use 3D multi_arrays of types bool and ints so I'll need to use a template.

Was it helpful?

Solution

It is unnecessary to use some special serialization libraries, because your data is already serialized in the memory and you can get it as follows (suppose A is the array containing int data:

int *data = A.data();
size_t size = A.num_elements();

You can just write it one by one to a file. A better way may be using mmap, like follows:

int fd = open("myfile", O_RDWR);
size_t bytes = size * sizeof(int);
ftruncate(fd, bytes);
void *buf = mmap(NULL, bytes, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
memcpy(buf, data, bytes);
close(fd);
munmap(buf, bytes);

It is very easy to reload the data from file to A. Just ommit the invocation of ftruncate and call memcpy(data, buf, bytes);.

An even better way is that, if your data is huge, you simply store the data in a file, use mmap to map it to a memory address, then pass the address to multi_array_ref. In this case you don't need to specifically write it to file. It is aromatically done by the OS.

The above code is considered for Linux, but I believe other platforms should have similar functionality. Error checking is omitted for clarity.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top