HNSW算法

news2024/11/16 15:42:16

From:

  1. HNSW算法(nsmlib/hnswlib)-CSDN博客
  2. HNSW算法的基本原理及使用 - 知乎

HNSW是一种广泛使用的ANN图索引结构,包括DiskANN、DF-GAS、SmartSSD等。本文档主要总结HNSW的结构与工作流程,便于后期研究其工作流程在迁移到CSD中存在的I/O问题

数据结构
  • HNSW在内存中的结构如下图所示。
  • 最下层是0层,越往上层数越大。除了0层外,上层的内存布局结构都相同。
  • 大概来说就是每层中的每个向量都会保存他的邻居数和邻居,不过0层会额外保存原始向量,非0层会额外保存其所在层到1层的所有邻居
  • (不过我不理解的地方是为什么上层的每个向量都要保存自顶向下的每一层的邻居域,不会造成重复存储嘛?只需要该节点在下一层的邻居域不就好了?或者说每个节点在内存中其实值保存了一份,每层之间是共享的?需要进一步调研)。

详细说明:

  1. 首先厘清变量含义:

maxM_:非0层最大的最大邻居数

maxM0_:0层最大邻居数,=2*maxM_

        2. 对于0层索引:

  • header(4 byte):header前2字节指定该向量在0层当前有几个邻居,后面一字节是标记删除位(增量构建用到),为内存对齐header第四字节废弃;
  • 邻居域:构造时就申请好了内存,每个0层向量可以有maxM0_个邻居向量(是非0层的2倍),占用字节数 = maxM0_ * 4 + 4字节(这个+4没解释是什么)
  • 数据域:占用字节数 = dim * sizeof(float) = dim * 4字节,以及label,对于我们就是向量id(如feed_id、video_id),占用8字节,共计dim*4+8字节

        0层全部数据保存在data_level0_memory_,构造索引时通过参数max_elements指定索引最大向量个数,data_level0_memory_一次性申请max_elements * size_data_per_element_字节的内存。

        3. 对于非0层索引:

  • 非0层主要存储每个向量在各个层的邻居表。具体是保存了每个向量丛它所在层向低层的邻居。如向量a构建时落在第3层,那么构建过程会不断更新它在1、2、3层的邻居向量。
  • linkLists_是邻居表存储实体,是一个二维数组,行由max_elements即最大向量个数指定,列由该向量实际落在的层数,在构建该向量时具体分配内存。(但是每个向量落到的层不一样,如果做成一个二维数组怎么根据每个向量实际层数灵活分配内存?做成链表?而且linkLists_是每层都有一个还是整个索引共享一个也不清楚)

个人理解(From SmartSSD中的介绍):

整个HNSW只包含两个表,一个表是存层0的,另一个表是1-N层的(上层的连接信息都存在表)。如图所示。

先说层0表,他有M行,M是总节点数。然后后续操作和数据结构都用这个表里的行数表示这个节点的索引。层0表主要目的是保存一个节点的邻居以及原始向量。邻居数量固定,因此层0表的空间是一开始就预分配好的。层0的邻居数是上层表邻居数的2倍(猜测是提高连通性保证召回率)。

然后是上层表,这个表主要是保存上层的节点间的连通信息。这个表的行数也和层0表相同,每行保存的是每个节点在上面每层的邻居。但是不是每个点都会贯穿所有层,所以需要保存这个点到底最高到几层,也就是每一行开头的第一个元素(这个数据布局和前面的那个图有点不一样,前面那个图没有每行开头的层数信息,不过大的数据结构是一样的)。按照论文的说法,由于不是每个节点都要贯穿每个层,没有延伸到的层就不需要分配空间可以节约内存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1411300.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【LeetCode: 148. 排序链表 + 链表 + 归并排序】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

防火墙源NAT配置

拓扑 需求 生产区在工作时间内可以访问服务器区,仅可以访问HTTP服务器。办公区全天可以访问服务区,其中,10.0.2.20可以访问FTP服务器和HTTP服务器 10.0.2.10仅可以ping通10.0.3.10办公区在访问服务区时采用匿名认证方式进行上网行为管理。办…

SAP创建资产号码和分配资产价值

文章目录 1 Creat new asset2 View asset3 Create old asset4 Transfer value5 Summary 1 Creat new asset T-code(AS01) 2 View asset T-CODE : AS03 3 Create old asset T-code(as91) 4 Transfer value T-code(ABLDT) If there is following information a…

双向队列的创建队首与队尾的操作deque()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 双向队列的创建 队首与队尾的操作 deque() [太阳]选择题 请问以下代码输出的结果是? from collections import deque print("【创建双向队列】d deque()") d deque(…

[Python] 机器学习 - 常用数据集(Dataset)之鸢尾花(Iris)数据集介绍,数据可视化和使用案例

鸢(yuān)尾花(Iris)数据集介绍 鸢【音:yuān】尾花(Iris)是单子叶百合目花卉,是一种比较常见的花,而且鸢尾花的品种较多,在某个公园里你可能不经意间就能碰见它。 鸢尾花数据集最初由Edgar Anderson 测量…

LeetCode 热题 100 | 子串

目录 1 560. 和为 K 的子数组 2 239. 滑动窗口最大值 3 76. 最小覆盖子串 菜鸟做题第二周,语言是 C 1 560. 和为 K 的子数组 题眼:“子数组是数组中元素的连续非空序列。” 解决本问题的关键就在于如何翻译问题。子数组 s 的和可以看作数组 i 的…

手撕重采样,考虑C的实现方式

一、参考文章: 重采样、上采样、下采样 - 知乎 (zhihu.com) 先直接给结论,正常重采样过程如下: 1、对于原采样率fs,需要重采样到fs1,一般fs和fs1都是整数哈,则先找fs和fs1的最小公倍数,设为m…

WordPress反垃圾评论插件Akismet有什么用?如何使用Akismet插件?

每次我们成功搭建好WordPress网站后,都可以在后台 >> 插件 >> 已安装的插件,在插件列表中可以看到有一个“Akismet反垃圾邮件:垃圾邮件保护”的插件(个人觉得是翻译错误,应该是反垃圾评论)。具…

【新书推荐】3.4 浮点型

本节必须掌握的知识点: 示例九 代码分析 汇编解析 浮点数的输出精度 【补充内容】 3.4.1 示例九 浮点型分为:单精度float、双精度double、长双精度long double。 类型 存储大小 值范围 精度 单精度 float 4字节 【1.2E-38~ 3.4E38】 6位小数 …

SpringMVC-对静态资源的访问

1.工程中加入静态资源 在webapp下创建static文件夹,此文件夹专门放入静态资源 2.使项目可以处理静态资源的请求 在SpringMVC配置文件中添加以下语句 1.引入命名空间 xmlns:mvc"http://www.springframework.org/schema/mvc" xsi:schemaLocation“http…

HarmonyOS鸿蒙学习笔记(23)监听Wifi状态变化

监听Wifi状态变化 前言创建接收状态变化的Bean对象创建订阅者和订阅事件参考资料: 前言 本篇博文通过动态订阅公共事件来说明怎么使用HarmonyOS监听Wifi状态的变化。关于动态订阅公共事件的概念,官网有详细说明,再次就不在赘述。博文相关项目…

UE5 Chaos系统 学习笔记

记得开插件: 1、锚点场 在锚点场范围内的物体静止且不被其他力场损坏 2、ClusterStrain 破裂效果的力 3、DisableField chaos破裂后的模拟物理在绿色范围内禁止模拟物理 4、ForceAndStrain 破裂效果的力 5、ForceAndStrainFallOff 破裂效果的力,但是…

代码随想录算法训练营第十一天 | 二叉树基础

代码随想录算法训练营第十一天 | 二叉树基础 文章目录 代码随想录算法训练营第十一天 | 二叉树基础1 二叉树的理论基础1.1 二叉树的类型1.2 二叉树的存储方式1.3 二叉树的遍历方式1.4 二叉树的定义 2 二叉树的递归遍历2.1 前序遍历2.2 中序遍历2.3 后序遍历 3 二叉树的迭代遍历…

【QT+QGIS跨平台编译】之十:【libbz2+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、libbz2介绍二、文件下载三、文件分析四、pro文件五、编译实践一、libbz2介绍 bzip2是一个基于Burrows-Wheeler 变换的无损压缩软件,压缩效果比传统的LZ77/LZ78压缩算法来得好。它是一款免费软件。可以自由分发免费使用。 bzip2能够进行高质量的数据压缩。它利用…

SpringBoot-yml文件的配置与读取

配置 值前边必须要有空格,作为分隔符 使用空格作为缩进表示层级关系,相同的层级左侧对齐 获取 使用Value(”${键名}”) 使用ConfigurationProperties(prefix "前缀") 1.前缀要与yml配置文件中的前缀一致 2.实体类的字段名与配置文件中的键名一…

linux conda 配置 stable video diffusion

安装教程 1 下载仓库源码 git clone https://github.com/Stability-AI/generative-models.git2 创建conda环境 conda create -n svd python3.10 conda activate svd3 安装pytorch gpu cuda和cudnn请参考其他链接配置,使用 conda 或者 pip 安装 pytorch # 使用c…

第二集《闻法仪轨》

请大家打开讲义第三面,甲二、于法、法师发起承事。 我们身为一个大乘的佛弟子,我们这一念明了的心,在一生当中,会遇到很多很多的佛法,也会遇到很多很多的法师,但不是所有的法师跟佛法对我们都是帮助的&…

EasyCVR视频智能监管系统方案设计与应用

随着科技的发展,视频监控平台在各个领域的应用越来越广泛。然而,当前的视频监控平台仍存在一些问题,如视频质量不高、监控范围有限、智能化程度不够等。这些问题不仅影响了监控效果,也制约了视频监控平台的发展。 为了解决这些问…

HCIA——29HTTP、万维网、HTML、PPP、ICMP;万维网的工作过程;HTTP 的特点HTTP 的报文结构的选择、解答

学习目标: 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议,了解典型网络设备的组成和特点,理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本方法进行…

Javaweb之SpringBootWeb案例之阿里云OSS服务入门的详细解析

2.3.2 入门 阿里云oss 对象存储服务的准备工作我们已经完成了,接下来我们就来完成第二步操作:参照官方所提供的sdk示例来编写入门程序。 首先我们需要来打开阿里云OSS的官方文档,在官方文档中找到 SDK 的示例代码: 参照官方提供…