2009-06-19 22 views
2

ファイルにデータを書き出し、それを読み戻すことができるファイル形式を書く必要があります。バイナリデータをファイルに書き込んで、高速に読み込むことができますか?

大量のデータをstd::vectorにブリッティングする必要があります(そのストレージは常に隣接して実装されているため)。

しかし、ファイルを書き込むときに、intやその他の型の整列とサイズにどのように制約を適用するかはわかりません。

これはどのように行う必要がありますか? Q6600(x86)でgccをbuntu linuxに使っています。ただ、一例として

struct Vertex 
{ 
    float point [3]; 
    float normal [3]; 
    float texcoord [2]; 
} 

は、後に、データが std::vector<Vertex>に格納されます。私は __attribute__を使用してそれを梱包し/整列させることを考えて、異なるプラットフォーム間で移植性を高めるようにしました。

編集: 私は既に仕様を作成しており、使用する予定です。データの最大ビットは頂点とインデックスです。したがって、それらは大きなブロックとして読み込まれます。たとえば、(より大きな仕様の一部): VertexGroupは特性を共有する頂点のグループです。一度に1つのマテリアルしか保持できないため、メッシュに含まれているマテリアルの数が多いはずです。

<uint> thisid # Of this VertexGroup 
<string> name 
<uint> materialId # A material 
<uint> vertexCount 
for (vetexCount): 
    <3xfloat> point 
    <3xfloat> normal 
    <2xfloat> texcoord 
<uint> triangleCount 
for (triangleCount): 
    <3xuint> indices 

答えて

2

これはコンパイラとプラットフォームによって異なります。私が知る限り、あなた自身のマクロをたくさん定義することなく、完全にクロスコンパイラとクロスプラットフォームの方法でこれを強制する方法はありません。

しかし、VC++とGCC(big two)は#pragma packディレクティブをサポートしているため、構造体の整列とパッキングを定義できます。 http://msdn.microsoft.com/en-us/library/2e70t5y1.aspxまたはhttp://gcc.gnu.org/onlinedocs/gcc/Structure_002dPacking-Pragmas.htmlを参照してください。

これを念頭に置いて、#pragma packを使用して構造体の整列方法を定義し、fread()などのようにバイトをファイルからメモリに単にblitすることができます。一覧全体のメモリを一度に割り当てることができるようにリストの先頭にリストの長さを付けることができます。次に、単一のI/O呼び出しを使用してファイル全体をロードします。

1

ちょうどそのPOD(普通の古いデータ)、ポインタを使用していれば、あなたはちょうどfwriteとfreadできます。もちろん、同じアーキテクチャーで以前とまったく同じ形式を読み返すことになります。

boost serializationを検討してください。

+0

ブーストシリアル化はどのくらいの速さですか?これは私に多くの面倒を節約することができ、それがどのように動作するか見ることは面白いだろう。私はそれがどのように配列を処理するのか、どれほど速いのか(ファイルに1000000個の頂点があるので、メモリ全体にデータブロックをblitするだけでは遅くなるだろう)と思います。 – solinent

+0

似たような質問があります: http://stackoverflow.com/questions/321619/c-serialization-performance –

関連する問題