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 × 声称的《星际迷航:下一代》中角色数据的存储容量(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 回答