gpt4 book ai didi

c++ - 从二进制文件中检索内存块

转载 作者:太空狗 更新时间:2023-10-29 23:13:04 24 4
gpt4 key购买 nike

总体目标是尽可能快地搜索和读取二进制文件。对于给定的有限参数集 p_1、p_2、...、p_n,我希望能够搜索二进制文件并检索与参数对应的内容。我的一般想法是以某种方式在参数集 {p_i} 和对应于 {p_i} 的起始内存位置之间创建一个(散列?)映射。当然,我还需要知道要读取多少字节,但这将由确定要读取的对象的 {p_i} 决定。代码将用 C++ 编写。

所以,我想我的问题是:

1- 实现搜索二进制文件目标的最快方法是什么?

2- 我的上述想法是否有意义?如果是,这是最有效的方法吗?

我很乐意回答任何后续问题。提前致谢!

最佳答案

大数据解决方案是将数据行划分为key和payload。考虑使用 k,而不是使用字母 p 作为键。这样,您就可以使用 p 作为有效负载。

键包含 HashMap ,如果键重复1,则包含多映射。这些关键字仅在主要搜索关键字 K n 上建立索引。

散列映射或散列多重映射的值是包含 Pn 的负载文件中的位置。根据有效负载数据的稀疏性 2 和其他相关因素,定位可能是以下任何一种。

  • 具有开始和结束字节或 block 索引的范围
  • 仅对固定长度记录的索引
  • 以某种方式自行消除长度歧义的序列化对象的起始字节或 block

有关搜索、插入、删除和更新操作的预期分布的详细信息3,以及这些操作是实时单独执行还是批量执行,将决定要使用的最佳协议(protocol)是什么添加或删除 key 及其关联的有效负载。

当查询速度是最重要的因素时,可以周期性地重新生成整个 key K和有效载荷P。如果可用性需要几个 9,您的 K 和 P 可能需要双缓冲,类似于在游戏显示适配器中使用多个显示缓冲区或端口。 (这是因为设计和处理可靠更新机制的成本可能超过将系统存储容量翻倍的成本。)

如果可以使 key 足够精简以适合内存,则该 key 运行速度最快并且保持简单。否则(在大查询中) key 需要通过某种 key 划分机制分布在集群的多个节点的内存中。在后一种情况下,有效负载也可以以对应于 key 分发的方式跨 RAID 设备分发。如果没有可用的集群,作为最后的手段, HashMap 可以在磁盘 4 上实现。

在搜索中,一旦您确定了您的键 K n,您就可以检索 P n 的数据范围并构造对象(或多个对象)多 map )从它。

打开有效负载文件以随机访问 P 并调用 fseek、lseek 或 lseek64 到位置 Pn 5。这些低级调用将任何给定 Pn 的适当磁盘扇区的定位委托(delegate)给操作系统、设备驱动程序、总线驱动程序、磁盘固件和相关硬件。


[1] 您可以使用您喜欢的库中的关联容器模板,或使用 std 命名空间的关联容器。

[2] 稀疏性是有效负载中字段具有值的程度。

[3] 另一个细节是,如果您正在构建一个库,您可能希望识别空可变长度值、未分配值、未知值或不确定值之间的差异(通过类型或状态代码)。

[4] 磁盘哈希容器的设计超出了一个简单的 StackOverflow 答案空间所能涵盖的范围。

[5] 这些 i/o 调用和如何打开文件描述符或流的手册页提供了如何使用随机访问 i/o 的详细信息。网上也有很多例子。

关于c++ - 从二进制文件中检索内存块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41817090/

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