我正在尋找一種簡單的方法來保存並從文件加載3D boost :: multi_array。 據我所知,在Boost庫中沒有任何方法我覺得很奇怪。如何將boost :: multi_array保存到文件
我不需要該文件是人類可讀的,所以二進制文件會更好的性能。 任何人都可以指向我現成的解決方案或給我如何實現這種讀/寫方法的想法?
我使用類型爲bool和ints的3D multi_arrays,所以我需要使用模板。
我正在尋找一種簡單的方法來保存並從文件加載3D boost :: multi_array。 據我所知,在Boost庫中沒有任何方法我覺得很奇怪。如何將boost :: multi_array保存到文件
我不需要該文件是人類可讀的,所以二進制文件會更好的性能。 任何人都可以指向我現成的解決方案或給我如何實現這種讀/寫方法的想法?
我使用類型爲bool和ints的3D multi_arrays,所以我需要使用模板。
沒有必要使用一些特殊的序列化庫,因爲你的數據在內存中已經序列化,你可以得到它,如下所示(假設A
被包含int
數據數組:
int *data = A.data();
size_t size = A.num_elements();
你可以寫一個一個文件一個更好的辦法可能是使用mmap
,就像如下:。
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);
這是很容易從文件中的數據寫入到A
只是ommit的我分配ftruncate
,並致電memcpy(data, buf, bytes);
。
更好的方法是,如果數據很大,只需將數據存儲在文件中,使用mmap
將其映射到內存地址,然後將地址傳遞給multi_array_ref
。在這種情況下,您不需要專門將其寫入文件。它由操作系統完成。
上面的代碼被認爲是Linux的,但我相信其他平臺應該具有類似的功能。爲了清晰起見,省略錯誤檢查。
謝謝!這非常有用! –
我假設'multi_array'中的元素是普通舊數據,沒有指向其他內存位置的指針。如果你的情況比這更復雜,你仍然需要編寫一些特定的序列化方法。 –
[Boost serialization](http://www.boost.org/doc/libs/1_52_0/libs/serialization/doc/index.html)怎麼樣? –
好吧,我正在閱讀此文。看起來這就是我需要的。 我搜索「將boost_multi_arrays保存到文件」的方法,但我不知道序列化是關鍵字。 謝謝 –