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

时间:2017-01-23 22:49:22

标签: c++ performance search binaryfiles

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

所以,我想我的问题是:

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

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

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

1 个答案:

答案 0 :(得分:0)

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

如果存在密钥重复 1 ,则密钥包含哈希映射或多映射。这些密钥仅在主要搜索关键字K n 上编制索引。

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

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

您预期的搜索,插入,删除和更新操作分发的详细信息 3 以及这些操作是单独实时还是批量完成将决定使用的最佳协议是什么添加或删除密钥及其相关的有效负载。

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

如果密钥可以精确到适合内存,那么密钥运行速度最快并且仍然很简单。否则(在大查询中)密钥需要通过一些密钥分割机制分布在集群的多个节点的存储器中。在后一种情况下,有效载荷也可以以对应于密钥分发的方式分布在RAID设备上。如果没有可用的集群,作为最后的手段,哈希映射可以在磁盘 4 上实现。

在搜索中,一旦识别出您的密钥K n ,您就可以检索P n 的数据范围并构造对象(或案例中的对象)从它那里得到的多图。

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

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

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

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

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

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