2012-11-18 91 views
1

我正在尋找一種簡單的方法來保存並從文件加載3D boost :: multi_array。 據我所知,在Boost庫中沒有任何方法我覺得很奇怪。如何將boost :: multi_array保存到文件

我不需要該文件是人類可讀的,所以二進制文件會更好的性能。 任何人都可以指向我現成的解決方案或給我如何實現這種讀/寫方法的想法?

我使用類型爲bool和ints的3D multi_arrays,所以我需要使用模板。

+1

[Boost serialization](http://www.boost.org/doc/libs/1_52_0/libs/serialization/doc/index.html)怎麼樣? –

+0

好吧,我正在閱讀此文。看起來這就是我需要的。 我搜索「將boost_multi_arrays保存到文件」的方法,但我不知道序列化是關鍵字。 謝謝 –

回答

1

沒有必要使用一些特殊的序列化庫,因爲你的數據在內存中已經序列化,你可以得到它,如下所示(假設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的,但我相信其他平臺應該具有類似的功能。爲了清晰起見,省略錯誤檢查。

+0

謝謝!這非常有用! –

+0

我假設'multi_array'中的元素是普通舊數據,沒有指向其他內存位置的指針。如果你的情況比這更復雜,你仍然需要編寫一些特定的序列化方法。 –