正在从二进制文件中检索内存块

Retrieving memory block from binary file

本文关键字:检索 内存 二进制文件      更新时间:2023-10-16

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

所以,我想我的问题是:

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

2-我上面的想法有道理吗?如果是,这会是最有效的方法吗?

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

大数据解决方案是将数据行划分为键和有效负载。不用字母p来表示密钥,可以考虑使用k。这样,就可以使用p来表示有效负载。

密钥包含哈希映射,或者如果存在密钥重复,则包含多映射1。这些关键字仅在主搜索关键字Kn上进行索引。

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

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

搜索、插入、删除和更新操作的预期分布的详细信息3,以及这些操作是实时单独执行还是批量执行,将决定添加或删除密钥及其相关有效载荷的最佳协议。

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

钥匙跑得最快,如果它能变得足够瘦以适应记忆,它就会保持简单。否则(在大型查询中)密钥将需要通过某种密钥划分机制分布在集群的多个节点的内存中。在稍后的情况下,有效载荷也可以以对应于密钥分布的方式分布在RAID设备之间。如果没有可用的集群,作为最后手段,散列映射可以在磁盘4上实现。

在搜索中,一旦您确定了密钥Kn,您就可以检索pn的数据范围,并从中构建对象(在多地图的情况下为对象)。

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


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

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

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

[4] 磁盘上散列容器的设计超出了简单StackOverflow答案空间所能涵盖的范围。

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