【Golang系统开发】搜索引擎(2) 压缩词典

news2024/11/24 11:43:46

写在前面

这篇文章我们就给出一系列的数据结构,使得词典能达到越来越高的压缩比。当然,和倒排索引记录表的大小相比,词典只占据了非常小的空间。那么为什么要对词典进行压缩呢?

这是因为决定信息检索系统的查询响应时间的一个重要因素就是磁盘的访问次数,而如果有部分词典存在于磁盘上,那么在处理查询时就需要更多的磁盘访问次数。 因此,词典压缩的主要目的是可以将词典放在内存当中,这样才会获得很高的查询吞吐率。那么如何能将更多的词典压缩在有限的内存中呢?

1. 词典看成单一字符串

最简单的词典的数据结构就是整个词典采用定长数组来存储且所有词项按照词典序排序。假设对每个词项采用20B的固定长度存储,文档频率采用4B存储,词项到倒排索引也采用4B存储。这里的4B指针能够访问4GB的地址空间(4B–>32位–>2的32次方–>4GB)。

在这里插入图片描述
这样即使我们的词典有 四百万 个,我们所占的内存就只是 4,000,000 * (20+4+4) B = 112 MB,只是一百多兆而已,这非常的压缩。

但是很明显,采用这种定长方法来存储词典存在空间浪费。一个中文三个字节,很多情况下我们的词典只是两个中文,也就是六个字节,所以会有 14字节的浪费 。但是如果是一些特定的词语超过了20字节(比如中南财经政法大学),这里又存不下去。一种解决上述缺陷的方法是将所有的词项存成一个长字符串,并给每个词项增加一个定位指针,他在指向下一词项的同时也表示这当前词项的结束。 同以往一样,仍然可以通过二分查法定位到所需的词项,但是现在的表更小了。

由于每20B能够节省下12B,所以相当于前面的定长机制而言,这种机制能够在词项存储上节省大约60%的空间。当然,以上计算没有包括指向词项的指针所消耗的空间。所有的这些指针寻址的空间大小为 400000 ∗ 8 = 3.2 ∗ 1 0 6 400000 * 8 = 3.2 * 10^6 4000008=3.2106 ,因此一个指针 可以用 log ⁡ 2 ( 3.2 ) ∗ 1 0 2 \log_2(3.2)*10^2 log2(3.2)102 约等于 22 位 或者 3B来表示

在这里插入图片描述
将整个词条看成一个长字符串的词典存储方式,其中指向下一词项的指针同时也标志着当前词项的结束。

在这种方式下,词条就将所有上述的 4,000,000 * (20+4+4) B = 112 MB 压缩到了 4,000,000 * (3+4+4+8) B = 76 MB ,这个 8 指的是每个词项的平均长度。这种就从 112MB --> 76MB 大大降低了1/3

2. 按块存储

我们可以根据上一节的结果进行再一次的压缩:将长字符串中的词项进行分组变成大小为k的块,即k个词项一组,然后对每个块只保留第一个词项的指针。同时用一个额外字典将每个词项的长度存储在每个词项的首部。因此,每个块而已,可以减少k-1个词项指针,但是需要额外的kB来保存k个词项的首部。

在这里插入图片描述
因此,对每个块而言,可以减少k-1个词项指针,到那时需要额外的kB来保存k个词项的长度。对于k=4,词项指针的存储将会减少 (k-1) * 3 = 9B ,但是同时需要增加 k=4B 来存储词项的长度。因此在按块存储的方式下,没k=4个词项的方式下,每k=4个词项就会节省出5B,所以总共节省的空间位 400000 * 1/4 * 5 = 5 MB,也就再次减少了5MB,在 76MB 的基础上又少了 71MB。

显然,k越大,压缩率也就越高。但是,在压缩和词项查找速度之间必须要保持某种平衡。否则会导致查找速率偏慢。

除此之外,还有一种前端编码方式的压缩,也就是将上面多个词的公共部分提取出来,这样能减少很多的空间。,这里就不过多讲解了。

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

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

相关文章

《计算机网络:自顶向下方法》第五章--网络层:控制平面

控制平面作为一种网络范围的逻辑,不仅控制沿着从源主机到目的主机的端到端路径间的路由器如何转发数据报,而且控制网络层组件和服务如何配置和管理 传统上,控制平面功能与数据平面的转发功能在一起实现,在路由器中作为统一的整体…

IDEA 如何制作代码补丁?IDEA 生成 patch 和使用 patch

什么是升级补丁? 比如你本地修复的 bug,需要把增量文件发给客户,很多场景下大家都需要手工整理修改的文件,并整理好目录,这个很麻烦。那有没有简单的技巧呢?看看 IDEA 生成 patch 和使用 patch 的使用。 介…

Kafka—工作流程、如何保证消息可靠性

什么是kafka? 分布式事件流平台。希望不仅仅是存储数据,还能够数据存储、数据分析、数据集成等功能。消息队列(把数据从一方发给另一方),消息生产好了但是消费方不一定准备好了(读写不一致)&am…

常量(constant)

1、概述 常量:是指在Java程序运行期间固定不变的数据。 2、分类 类型含义数据举例整数常量所有的整数0,1,567,-9 小数常量 (浮点数常量) 所有的小数0.0,-0.1,2.55字符常量单引号引起…

Python量化交易11——使用AKShare获取公司财务数据

AKshare库是一个很好用的金融数据获取的API,股票的数据很全面,还有很多别的数据: 链接:AKShare 股票数据 — AKShare 1.10.85 文档 他们获取来源都是东方财富网或者巨潮网等,都会写上的。 本次教大家怎么用AKshare获取…

第九章 动态规划part11(代码随想录)

123.买卖股票的最佳时机III 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票&…

vscode如何汉化

首先我们到vscode官网下载 链接如下: Visual Studio Code - Code Editing. Redefined 根据自己需要的版本下载就好 下载并且安装完毕之后 运行vscode 然后按快捷键 CTRLSHIFTX 打开安装扩展界面 搜索简体中文 安装就可以了 谢谢大家观看

Matplotlib数据可视化(一)

目录 1.Matplotlib简介 2.Matplotlib绘图基础 2.1 创建画布与子图 2.2 添加画布属性 2.3 绘图的保存与显示 1.Matplotlib简介 Matplotlib是一个用于绘制数据可视化图表的Python库。它提供了广泛的功能和灵活性,可以创建各种类型的图表,包括折线图、…

Microsoft Edge浏览器开启ChatAI扩展

ChatAi每日可以免费使用5次,购买每月8.8,每年88。价格还不算贵 安装扩展过程: 打开 Microsoft Edge浏览器,点击右上角三个点,在扩展中选择加载项,在Microsoft Edge加载项中搜索openai,选择Chat…

kafka晋升之路-理论+场景

kafka晋升之路 一:故事背景二:核心概念2.1 系统架构2.2 生产者(Producer)2.2.1 生产者分区2.2.2 生产者分区策略 2.3 经纪人(Broker)2.3.1 主题(Topic)2.3.2 分区(Partit…

人工智能与云计算实训室建设方案

一、 人工智能与云计算系统概述 人工智能(Artificial Intelligence,简称AI)是一种模拟人类智能的科学和工程,通过使用计算机系统来模拟、扩展和增强人类的智能能力。人工智能涉及多个领域,包括机器学习、深度学习、自然…

k8s简介及虚拟机快速搭建k8s集群

文章目录 1、k8s简介1.1、部署方式的变迁1.2、定义1.3、Kubernetes提供的功能 2、虚拟机快速搭建k8s集群2.1、虚拟机配置(centos7 2G内存2个处理器)2.2、基础环境准备2.3、docker安装(易踩坑)2.4、安装k8s组件2.5、master节点部署…

英飞凌在车辆信息安全方面上应用

如今,网络安全在多个层面影响着我们每个人。我们的专业工作、个人生活,甚至我们的汽车,都依赖于复杂软件上运行的连接和技术。随着信息技术日益融入我们的日常生活,我们对后续信息系统的依赖性也与日俱增。反过来,这些…

Win10+anaconda+CUDA+pytorch+vscode配置

Win10anacondaCUDApytorchvscode配置 1.安装anaconda2.安装CUDA确认CUDA版本确认CUDA和pytorch版本安装CUDA 3.安装cudnn4.安装Pytorch5.vscode配置安装VScodevscode配置pytorch环境 1.安装anaconda 官网https://www.anaconda.com 下载安装,路径全英文然后记得有一…

【微服务】springboot 整合mysql实现版本管理通用解决方案

目录 一、前言 1.1 单独执行初始化sql 1.2 程序自动执行 二、数据库版本升级管理问题 三、spring 框架sql自动管理机制 3.1 jdbcTemplate 方式 3.1.1 创建数据库 3.1.2 创建 springboot 工程 3.1.3 初始化sql脚本 3.1.4 核心配置类 3.1.5 执行sql初始化 3.2 配置文…

numpy基础知识

文章目录 安装numpynumpy的ndarray对象ndarray 和 list 效率比较创建一/二维数组ndarray的常用属性调整数组形状ndarray转list numpy的数据类型数组的运算数组和数的计算数组和数组的计算 数组的轴数组的索引和切片数组的与或非和三目运算符numpy的插入、删除、去重插入删除去重…

财务数据分析用什么软件好?财务数据分析的几个重要数据是什么?

财务的数据分析也分很多种的,就拿最粗略的划分来说,也可以分为3大领域—— 财务数据处理类工具财务数据挖掘类工具财务数据可视化工具 01 数据处理类 在财务数据处理这一块儿,不用说,当然是以excel为主力的数据处理类工具—— …

22年电赛B题——具有自动泊车功能的电动车——做题记录以及经验分享

前言 这道题目也是小车类电赛题目,十月份的电赛题,由于之前积累了一些经验,这道题目在做下来的感觉还行,但是我们看题目没有仔细审题,和题目要求有一些些偏差,但是基础大功能还是做出来辽,大家还是可以参考…

SASS 学习笔记 II

SASS 学习笔记 II 上篇笔记,SASS 学习笔记 中包含: 配置 变量 嵌套 这里加一个扩展,嵌套中有一个 & 的用法,使用 & 可以指代当前 block 中的 selector,后面可以追加其他的选择器。如当前的 scope 是 form&a…

zotero在不同系统的安装(win/linux)

1 window系统安装 zotero 官网: https://www.zotero.org/ 官方文档 :https://www.zotero.org/support/ (官方)推荐常用的插件: https://www.zotero.org/support/plugins 入门视频推荐: Zotero 文献管理与知识整理最佳实践 点击 exe文件自…