正在从二进制文件中检索内存块
Retrieving memory block from binary file
总体目标是尽可能快地搜索和读取二进制文件。对于给定的有限参数集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的详细信息。网上也有很多例子。
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 使用VerQueryValue检索应用程序的文件描述
- 如何在不等待检索的情况下获取C++中的内存位置?
- 正在从二进制文件中检索内存块
- 使用 XPTR 在内存中存储和检索矩阵
- 检索FreeBSD系统中进程的内存使用情况
- 查询从内存映射文件检索到的Rtree时出现分段错误
- 为遗传算法分配和检索逐位内存值
- 正在从内存中检索图像数据