1

3D boost::multi_array をファイルに保存して読み込む簡単な方法を探しています。私の知る限り、Boost ライブラリには奇妙なメソッドはありません。

ファイルを人間が読める形式にする必要はないので、バイナリ ファイルの方がパフォーマンスが向上します。既製のソリューションを教えてくれたり、そのような読み取り/書き込みメソッドを実装する方法についてアイデアをくれたりできますか?

bool 型と int 型の 3D multi_arrays を使用するため、テンプレートを使用する必要があります。

4

1 に答える 1

2

データはすでにメモリ内でシリアル化されており、次のように取得できるため、特別なシリアル化ライブラリを使用する必要はありません(データAを含む配列があるとします。int

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

ファイルに1つずつ書き込むことができます。より良い方法は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。の呼び出しを省略して、ftruncateを呼び出しますmemcpy(data, buf, bytes);

さらに良い方法は、データが巨大な場合、データをファイルに保存し、それを使用mmapしてメモリアドレスにマップしてから、アドレスをに渡すことmulti_array_refです。この場合、特にファイルに書き込む必要はありません。それはOSによって芳香的に行われます。

上記のコードはLinuxで考慮されていますが、他のプラットフォームでも同様の機能が必要だと思います。わかりやすくするために、エラーチェックは省略されています。

于 2012-11-19T06:46:46.093 に答える