4

ファイルの行番号へのポインタを配列に格納し、後で指定した行をディスクから取得したいと考えています。ファイルを読み戻すとメモリの場所が変更されるため、行番号へのポインタを直接保存することはできません。そのため、代わりにファイルの先頭からのオフセットを保存しています。オフセットを保存するために、「uint_64t」を使用しています。ただし、私のファイル サイズは 200GB であるため、「uint_64t」はすべてのオフセットを表すことができません。

次の質問があります。

  1. オフセットを保存する以外に、ディスクに保存されているファイルへのポインターを保存する方法は他にありますか?

  2. 私が使用できる他のデータ構造はありますか(uint64_t以外)。

4

4 に答える 4

9

POSIX システムでoff_tは、ファイル オフセットの標準タイプです。おそらく 64 ビット型ですが、 と同じようuint64_tに、2e11 程度の値を問題なく保持できるためです。

于 2013-06-11T10:37:55.917 に答える
7

あなたが間違っている。Auint64_tは 64 ビットなので、それまでのファイルでオフセットを表現できます2^64 bytes = 18.45 exabytes。Wolfram Alpha によると、次のように比較できます。

  • すべての人間の知識の推定情報量 (1999 年半ば現在) (~ 12 EB )
  • 180 × キャラクターの想定ストレージ容量 Star Trek: The Next Generation のデータ ( 8×10^17 b )

ファイルがそれほど大きいわけではありません。:)

于 2013-06-11T10:39:40.920 に答える
5

64 ビットの符号なし整数は、バイト オフセットを 200 GB ファイルに格納するのに十分な大きさである必要があります。

200 GB = 200 GB * 1024 MB/GB * 1024 KB/MB * 1024 Bytes/KB = 214,748,364,800 Bytes

ただし、64 ビット整数には範囲があります。

Low: 0, High: 18,446,744,073,709,551,615

問題がわかりません。そのファイルのすべてのバイトに簡単にインデックスを付けることができます。実際のところ、ファイルのすべてのビットにインデックスを作成しても、まだ拡張の余地がたくさんあります!

于 2013-06-11T10:43:13.200 に答える
0

いくつかのエンコード方式に従って、オフセット値を格納できます。

例: ファイル オフセット値は 2 または 4 で除算され、uint64_t 変数に保持されます。したがって、値の範囲は合理的に縮小されます。

データの読み取り中に、uint64_t 変数値を取得し、2 または 4 (以前に使用) を掛けて、正確なオフセット値を取得します。

于 2013-06-11T11:17:02.603 に答える