gpt4 book ai didi

c++ - 在文件中的任意位置插入动态大小的对象

转载 作者:行者123 更新时间:2023-11-30 04:22:44 31 4
gpt4 key购买 nike

我有一个具有以下结构的二进制文件:

+--------+--------+------+----+--------+
|页眉 |对象 1 |对象2 | ... |索引 |
+--------+--------+-----+----+--------+

Index 是一个可变大小的 vector ,具体取决于对象的数量并存储每个对象的文件位置。例如

vector<size_t> index;

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

文件也很大 (1Gb+)。

我想把索引放在标题后面,这样阅读起来会更快。我可以这样做而不必复制和写入所有对象两次吗?谢谢。

最佳答案

您有两个解决方案:

  • 为索引使用一个单独的文件
  • 继续基于 block 的设计

第一个比较明显,所以我只概述第二个:这里的问题是您的索引大小取决于您流式传输的对象数。不必如此。

一个解决方案是跳过一定数量的空间(稍后用于索引),将对象流式传输(最多 N),记录你在哪里,回到索引处写下来,然后继续下一个 block (注意:这里的 block 不是固定大小的)。

布局示例:

- 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) 的链表,交错在存储中间。

注意:第三种解决方案是使用一个简单的 SQLite 文件并让它为您建立索引...

关于c++ - 在文件中的任意位置插入动态大小的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13632025/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com