1

次の構造のバイナリ ファイルがあります。

+---------+-------+------+----+-------+
| ヘッダー | オブジェクト 1 | オブジェクト 2 | ... | インデックス |
+---------+-------+------+----+-------+

Index、オブジェクトの数に応じて可変サイズのベクトルであり、各オブジェクトのファイル位置を格納します。例えば

vector<size_t> index;

index.push_back(ofs.tellp());
write(reinterpret_cast<char *> obj, sizeof(obj));

また、ファイルはかなり大きい (1Gb+)。

ヘッダーの直後にインデックスを配置したいので、読みやすくなります。すべてのオブジェクトを 2 回コピーして書き込む必要なく、これを行うことはできますか? ありがとう。

4

3 に答える 3

1

次の 2 つの解決策があります。

  • インデックスに別のファイルを使用する
  • チャンクベースの設計に進む

最初のものは比較的明白なので、2 番目のものだけを概説します。ここでの問題は、インデックスのサイズがストリーミングするオブジェクトの数に依存することです。そうである必要はありません。

解決策は、一定量のスペースをスキップし(後でインデックス作成に使用される)、オブジェクトをストリーミングし(最大 N 個)、現在地を記録し、インデックスに戻って書き留めてから、次のチャンクに移動することです。 (注: チャンクはここでは固定サイズではありません)。

レイアウト例:

- Step 1: skip index space and start streaming objects

| Header | <unused space for now> | Obj 1 | Obj 2   | O3 | ... Obj N |


- Step 2: after writing N objects write the index,
          record the offset,
          start a new chunk

| Header | I1 | ... | IN | Offset | Obj 1 | Obj 2   | O3 | ... Obj N | <unused sp

したがって、インデックスは、ストレージの中央にインターリーブされた固定サイズのチャンク (N) のリンクされたリストとして構築されます。

注: 3 番目の解決策は、単純な SQLite ファイルを使用してインデックスを作成することです...

于 2012-11-29T19:08:52.823 に答える
1

ファイルを書き込んでいる場合 持っているオブジェクトの数を計算します。

nObjects // Number of objects

次に、必要になります

indexSize = nObjects * sizeof(size_t);

オブジェクトの作成を開始する

ofs.seekp(indexSize + headerSize)

すべてのオブジェクトを書く

index.push_back(ofs.tellp());
write(reinterpret_cast<char *> obj, sizeof(obj));

インデックスの先頭に移動します ofs.seekp(headerSize);

インデックスを書く

于 2012-11-29T18:34:14.230 に答える
0

答えは NO だと思いますが、低レベルのファイル システム ツールがあり、選択したファイル システムを操作する方法を知っている場合は、これを実行できる可能性があります。

たとえば、FAT テーブルにファイルが存在するディスク セクターに関する情報が格納されている古い愚かな FAT を使用しているとします。次に、インデックスにセクターを割り当て、ファイルに関連する FAT テーブル エントリを変更して、ファイルの新しい順序を指定します。ファイルのディスク上のセクター。基本的に、すべてを再保存せずに並べ替えます。

これが NTFS、ZFS などでどのように機能するかはわかりませんが、NTFS 構造を操作しない限り、不可能であると確信しています。

それは理にかなっていますか?

于 2012-11-29T18:21:49.550 に答える