当前位置: 首页 > news >正文

学习随记:word2vec的distance程序源码注释、输入输出文件格式说明

  1. word2vec中有5个程序,其中demo-word.sh中涉及两个:word2vec、distance。考虑到distance比较简单,所以我从这个入手,希望通过简单代码理解如何在一个高维数据空间计算距离(查找)。
  2. 一维数据的查找,一般是通过二分法进行比较,找到完全相等的元素。完全相等本质是距离为0.
  3. 推论,高维词向量空间中,找到完全相等的结果,是不可能的。于是,我们用距离较近的N个单词作为结果集。后续,可以在此结果集基础上做进一步的运算。
  4. 一维坐标轴上,两个点的距离是|x1-x2| 也可以用sqrt((x1-x2)*(x1-x2))。
  5. 为什么不直接用(x1-x2) ,而要用平方后开方?因为距离这个一维概念只能大于等于0,等于0就是同一个点。
  6. 二维坐标轴上,两个点的距离是sqrt((x1-x2)(x1-x2)+(y1-y2)(y1-y2)),这是勾股定理,计算二维点的一维距离值。
  7. 3维到N维坐标轴上,两个点的距离是sqrt((x1-x2)(x1-x2)+(y1-y2)(y1-y2)+…+(z1-z2)*(z1-z2))
  8. 归一化,相当于把所有词向量都映射到了R==1的单位圆单位球上了,只是这是一个N维球体,无法想象,但三维的计算方式可以推理应用到任意维度。很明显,高维数学知识至少是需要了解的。
		for (a = 0; a < dim_size; a++) len += f_mat[a + b * dim_size] * f_mat[a + b * dim_size];//向量平方和,向量模的平方len = (float)sqrt(len);//向量模长度if (len == 0.0f) {fprintf(stderr, "Warning: Vector length is zero for word: %s\n", &vocab[b * max_word_len]);continue; // 跳过当前单词的归一化}for (a = 0; a < dim_size; a++) f_mat[a + b * dim_size] /= len;//归一化向量,归一化后的平方和等于1
  1. 句子的向量计算
		for (a = 0; a < dim_size; a++) vec[a] = 0;//初始化多个输入单词对应的向量累计值for (b = 0; b < input_word_count; b++) {if (input_word_index[b] == -1) continue;//把多个输入单词的向量相加,可以理解为句子的向量for (a = 0; a < dim_size; a++) vec[a] += f_mat[a + input_word_index[b] * dim_size];}len = 0;for (a = 0; a < dim_size; a++) len += vec[a] * vec[a];//句子的向量模平方len = (float)sqrt(len);//句子的向量模长for (a = 0; a < dim_size; a++) vec[a] /= len;//句子的向量归一化
  1. 输入单词/句子的向量归一化
for (a = 0; a < dim_size; a++) vec[a] = 0;//初始化多个输入单词对应的向量累计值for (b = 0; b < input_word_count; b++) {if (input_word_index[b] == -1) continue;//把多个输入单词的向量相加,可以理解为句子的向量for (a = 0; a < dim_size; a++) vec[a] += f_mat[a + input_word_index[b] * dim_size];}len = 0;for (a = 0; a < dim_size; a++) len += vec[a] * vec[a];//句子的向量模平方len = (float)sqrt(len);//句子的向量模长for (a = 0; a < dim_size; a++) vec[a] /= len;//句子的向量归一化
  1. 输入单词/句子与所有单词之间的距离
    此处距离计算直接是x1x2+y1y2+…+z1*z2,实际是点积计算、余弦相似度计算
for (a = 0; a < dim_size; a++) 
dist += vec[a] * f_mat[a + c * dim_size];

这个原理见下图
在这里插入图片描述

distance.c源码注释

//https://github.com/swordll80/word2vec/blob/master/distance.c
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>#ifdef _WIN32
#define max_size ((long long)2000)			// max length of strings
#define closest_word_count  ((long long)40) // number of closest words that will be shown,输出时展示与输入单词余弦相似度最高的前 N 个单词
#define max_word_len  ((long long)50)		// max length of vocabulary entries,词汇表中单词的最大长度
#else
const long long max_size = 2000;         // max length of strings
const long long closest_word_count = 40;                  // number of closest words that will be shown
const long long max_w = 50;              // max length of vocabulary entries
#endifvoid print_word_vec(char* word_str, float* f_mat, long long size); //打印单个单词的向量值int main(int argc, char** argv) {FILE* word_vec_bin_file;		//word2vec程序训练出来的二进制数据文件。C:/code/word2vec/vectors.binchar input_str_line[max_size];	//存储用户输入的字符串(单词或句子)char* best_word_str[closest_word_count];//存储与输入单词最接近的前 N 个单词。char file_name[max_size];		//存储词向量文件的路径。char str_array[100][max_size];	//将用户输入的字符串拆分成单个单词存储float dist;						//用于计算输入向量与其他向量之间的余弦相似度。float len;						//向量的长度(模),用于归一化。float best_dist[closest_word_count];//存储与输入单词最接近的前 N 个单词的余弦相似度值。float vec[max_size];			//用户输入单词向量的累积值。long long words_count;			//文件中包含的单词总数。long long dim_size;				//每个单词向量的维度。long long a, b, c, d;			//循环变量。long long input_word_count;		//输入的单词数long long input_word_index[100];//输入单词在词汇表中的索引float* f_mat;					//存储所有词向量的矩阵(按行存储)char* vocab;					//存储词汇表中所有单词。if (argc < 2) {printf("Usage: ./distance <FILE>\nwhere FILE contains word projections in the BINARY FORMAT\n");return 0;}strcpy_s(file_name, sizeof(file_name), argv[1]);errno_t err = fopen_s(&word_vec_bin_file, file_name, "rb");if (word_vec_bin_file == NULL || 0 != err) {printf("Input file not found\n");return -1;}fscanf_s(word_vec_bin_file, "%lld", &words_count);	//71291 (用字符串存储,后面是一个空格0x20)fscanf_s(word_vec_bin_file, "%lld", &dim_size);		//200 (用字符串存储,后面是一个0x0A==\n==换行)vocab = (char*)malloc((long long)words_count * max_word_len * sizeof(char));//单词表,每个单词最长50for (a = 0; a < closest_word_count; a++) best_word_str[a] = (char*)malloc(max_size * sizeof(char));//相似度最高的词条或句子f_mat = (float*)malloc((long long)words_count * (long long)dim_size * sizeof(float));//每个单词用200个32位浮点数存储if (f_mat == NULL) {printf("Cannot allocate memory: %lld MB    %lld  %lld\n", (long long)words_count * dim_size * sizeof(float) / 1048576, words_count, dim_size);return -1;}for (b = 0; b < words_count; b++) {//71291个单词循环a = 0;while (1) {//读一个单词,以空格结束vocab[b * max_word_len + a] = (char)fgetc(word_vec_bin_file);//读一个字符if (feof(word_vec_bin_file) || (vocab[b * max_word_len + a] == ' ')) break;//空格或文件结束if ((a < max_word_len) && (vocab[b * max_word_len + a] != '\n')) a++;//忽略换行符\n}vocab[b * max_word_len + a] = 0;//单词结束符for (a = 0; a < dim_size; a++) fread(&f_mat[a + b * dim_size], sizeof(float), 1, word_vec_bin_file);//读取一个单词的200个float,后面有一个\nlen = 0;//if (0 == b)print_word_vec(&vocab[b * max_w], &M[b * size], size);//输出测试for (a = 0; a < dim_size; a++) len += f_mat[a + b * dim_size] * f_mat[a + b * dim_size];//向量平方和,向量模的平方len = (float)sqrt(len);//向量模长度if (len == 0.0f) {fprintf(stderr, "Warning: Vector length is zero for word: %s\n", &vocab[b * max_word_len]);continue; // 跳过当前单词的归一化}for (a = 0; a < dim_size; a++) f_mat[a + b * dim_size] /= len;//归一化向量,归一化后的平方和等于1//if (0 == b)print_word_vec(&vocab[b * max_w], &M[b * size], size);//输出测试}fclose(word_vec_bin_file);while (1) {for (a = 0; a < closest_word_count; a++) best_dist[a] = 0;//初始化for (a = 0; a < closest_word_count; a++) best_word_str[a][0] = 0;//初始化printf("Enter word or sentence (EXIT to break): ");a = 0;while (1) {//读取用户输入的单词或句子,例如 franceinput_str_line[a] = (char)fgetc(stdin);if ((input_str_line[a] == '\n') || (a >= max_size - 1)) {input_str_line[a] = 0;break;}a++;}if (!strcmp(input_str_line, "EXIT")) break;//退出程序input_word_count = 0;b = 0;c = 0;while (1) {str_array[input_word_count][b] = input_str_line[c];b++;c++;str_array[input_word_count][b] = 0;if (input_str_line[c] == 0) break;if (input_str_line[c] == ' ') {//输入的是句子,拆为多个单词存放input_word_count++;b = 0;c++;}}input_word_count++;for (a = 0; a < input_word_count; a++) {for (b = 0; b < words_count; b++) if (!strcmp(&vocab[b * max_word_len], str_array[a])) break;if (b == words_count) b = -1;//没找到用户输入的单词input_word_index[a] = b;//找到每个单词的序号,例如 france 对应 vocab[303]printf("\nWord: %s  Position in vocabulary: %lld\n", str_array[a], input_word_index[a]);if (b == -1) {printf("Out of dictionary word!\n");break;}}if (b == -1) continue;printf("\n                                              Word       Cosine distance\n------------------------------------------------------------------------\n");for (a = 0; a < dim_size; a++) vec[a] = 0;//初始化多个输入单词对应的向量累计值for (b = 0; b < input_word_count; b++) {if (input_word_index[b] == -1) continue;//把多个输入单词的向量相加,可以理解为句子的向量for (a = 0; a < dim_size; a++) vec[a] += f_mat[a + input_word_index[b] * dim_size];}len = 0;for (a = 0; a < dim_size; a++) len += vec[a] * vec[a];//句子的向量模平方len = (float)sqrt(len);//句子的向量模长for (a = 0; a < dim_size; a++) vec[a] /= len;//句子的向量归一化for (a = 0; a < closest_word_count; a++) best_dist[a] = -1;//初始化距离for (a = 0; a < closest_word_count; a++) best_word_str[a][0] = 0;//初始化字符串for (c = 0; c < words_count; c++) {//与所有单词计算距离a = 0;for (b = 0; b < input_word_count; b++) if (input_word_index[b] == c) a = 1;if (a == 1) continue;//跳过句子中出现过的单词dist = 0;for (a = 0; a < dim_size; a++) dist += vec[a] * f_mat[a + c * dim_size];//输入句子与单词的距离计算for (a = 0; a < closest_word_count; a++) {if (dist > best_dist[a]) {//插入找到的距离更大的单词(dist值越大,相关度越大)for (d = closest_word_count - 1; d > a; d--) {//移动后面的单词best_dist[d] = best_dist[d - 1];strcpy_s(best_word_str[d], max_size, best_word_str[d - 1]);}best_dist[a] = dist;strcpy_s(best_word_str[a], max_size, &vocab[c * max_word_len]);break;}}}for (a = 0; a < closest_word_count; a++) printf("%50s\t\t%f\n", best_word_str[a], best_dist[a]);}return 0;
}void print_word_vec(char* word_str, float* f_mat, long long size) {//打印一个单词的向量,典型值就是100个浮点数const int count_per_line = 10;//每行的浮点数const int line_count = (int)(size / count_per_line);//完整的行数const int less_count = size % count_per_line;//最后一行的数目printf("%s\n", NULL == word_str ? "NULL" : word_str);for (int line_index = 0; line_index < line_count; ++line_index) {for (int data_index = 0; data_index < count_per_line; ++data_index) {printf("%10.6f ", f_mat[line_index * count_per_line + data_index]);}printf("\n");}if (less_count > 0) {for (int data_index = 0; data_index < less_count; ++data_index) {printf("%10.6f ", f_mat[line_count * count_per_line + data_index]);}printf("\n");}
}

word2vec的输入文件text8的格式

解压后97657KB,将近100MB,全部是英文单词组成的文本,甚至找不到逗号句号。
有个特殊单词是代码中固定加入的:AddWordToVocab((char*)“”);
可能是作为某种分界符。
在这里插入图片描述
text8第一行(实际是文本软件强行的分行,源文件并没有换行符)及其翻译。
在这里插入图片描述
据说text8的内容来自维基百科。

word2vec的输出文件vectors.bin的格式

vectors.bin是一个二进制数据文件,56353KB,但实际上最前面两个整数参数就是字符串,中间的词条结束符就是空格,所以,严格来说,这个文件是个混合文件,里面的float是二进制存储方式。
vectors.txt形式附在后面。
distance程序只接受vectors.bin二进制数据形式。
在这里插入图片描述
上图中,

  1. 71291是当前文件词条总数,后面一个空格0x20分隔。
  2. 200是词向量维度,这个是运行word2vec的参数-size 200决定的,后面一个换行符0xA分隔。
  3. 第一个词条是代码强行加进去的,后面紧跟着一个空格0x20分隔。
  4. 第一个词条对应的200个float,紧挨着前面的空格存储,连4字节对齐都没有,0xF6就是第一个浮点数0xF628033B的第一个字节(实际是小尾的最后一个字节)。
  5. 第一个词条对应的200个float中的最后一个float在0x32B那个位置,0xF6A813BA,后面有一个换行符0xA分隔。
  6. 第二个词条是the,位置就是0x330,后面是空格分隔。
  7. 后面就是重复以上格式存储完71291个词条。
  8. 最后一个词条的最后一个float结束后,也有一个换行符0xA分隔。
    在这里插入图片描述

本地win11下运行word2vec的完整参数说明

./word2vec.exe -train text8 -output vectors.bin-cbow 1      使用连续词袋模型cbow;默认值为 1(对于 skip-gram 模型使用 0-size 200    词向量大小(维度)-window 8    词之间的最大跳过长度-negative 25 负面示例的数量-hs 0        使用分层 Softmax;默认值为 0(未使用)-sample 1e-4 词出现的阈值-threads 20  线程数-binary 1    以二进制模式保存结果向量;默认值为 0(关闭)-iter 15     训练迭代

相关文章:

学习随记:word2vec的distance程序源码注释、输入输出文件格式说明

word2vec中有5个程序&#xff0c;其中demo-word.sh中涉及两个&#xff1a;word2vec、distance。考虑到distance比较简单&#xff0c;所以我从这个入手&#xff0c;希望通过简单代码理解如何在一个高维数据空间计算距离&#xff08;查找&#xff09;。一维数据的查找&#xff0c…...

CSS 之 position 定位属性详解

CSS系列文章目录 CSS 之 display 布局属性详解 CSS 之 position 定位属性详解一文搞懂flex布局 【弹性盒布局】 文章目录 CSS系列文章目录一、前言二、静态定位&#xff1a;position:static&#xff1b;二、相对定位&#xff1a;position:relative三、绝对定位&#xff1a;pos…...

初学STM32 --- USMART

目录 USMART简介 USMART主要特点&#xff1a; USMART原理 USMART组成&#xff1a; USMART 的实现流程简单概括 USMART扫描函数&#xff1a; USMART系统命令 USMART移植 USMART简介 USMART是一个串口调试组件&#xff0c;可以大大提高代码调试效率&#xff01; USMART主…...

MySQL叶子节点为啥使用双向链表?不使用单向呢?

文章内容收录到个人网站&#xff0c;方便阅读&#xff1a;http://hardyfish.top/ 文章内容收录到个人网站&#xff0c;方便阅读&#xff1a;http://hardyfish.top/ 文章内容收录到个人网站&#xff0c;方便阅读&#xff1a;http://hardyfish.top/ MySQL 中的 B 树索引&#x…...

4_TypeScript 条件语句 --[深入浅出 TypeScript 测试]

在 TypeScript 中&#xff0c;条件语句用于根据不同的条件执行不同的代码块。这些语句包括 if 语句、else if 语句、else 语句和 switch 语句。通过使用条件语句&#xff0c;你可以编写出能够根据特定逻辑分支的代码&#xff0c;从而实现更加动态和灵活的功能。 1. if 语句 i…...

vue elementUI Plus实现拖拽流程图,不引入插件,纯手写实现。

vue elementUI Plus实现拖拽流程图&#xff0c;不引入插件&#xff0c;纯手写实现。 1.设计思路&#xff1a;2.设计细节3.详细代码实现 1.设计思路&#xff1a; 左侧button列表是要拖拽的组件。中间是拖拽后的流程图。右侧是拖拽后的数据列表。 我们拖动左侧组件放入中间的流…...

图漾相机基础操作

1.客户端概述 1.1 简介 PercipioViewer是图漾基于Percipio Camport SDK开发的一款看图软件&#xff0c;可实时预览相机输出的深度图、彩色图、IR红外图和点云图,并保存对应数据&#xff0c;还支持查看设备基础信息&#xff0c;在线修改gain、曝光等各种调节相机成像的参数功能…...

【阅读笔记】基于FPGA的红外图像二阶牛顿插值算法的实现

图像缩放技术在图像显示、传输、分析等多个领域中扮演着重要角色。随着数字图像处理技术的发展&#xff0c;对图像缩放质量的要求也越来越高。二阶牛顿插值因其在处理图像时能够较好地保持边缘特征和减少细节模糊&#xff0c;成为了图像缩放中的一个研究热点。 一、 二阶牛顿插…...

K210识别技术简介与基础使用方法

目录 一、K210芯片概述 二、K210的硬件配置与开发环境 1. 硬件配置 2. 开发环境 三、K210的识别技术基础 1. 图像识别 2. 语音识别 四、K210识别技术的基础使用方法 1. 图像识别基础使用 2. 语音识别基础使用 五、K210识别技术的应用场景 六、总结与展望 一、K210芯…...

【Android学习】Adapter中使用Context

参考文章 文章目录 1. 通过 Adapter 构造函数传入 Context2. 通过 Parent.context 获取3. 通过 onAttachedToRecyclerView() 方法获取4. 通过 ImageView 获取 context (局限于本例子中)5. 四种方法对比分析6. 作者推荐的方法 需求&#xff1a; Glide加载图片需要用到Context 1…...

LLM大模型RAG内容安全合规检查

1.了解内容安全合规涉及的范围 我们先回顾一下智能答疑机器人的问答流程。问答流程主要包括用户、智能答疑机器人、知识库、大语言模型这四个主体。 涉及内容安全的关键阶段主要有&#xff1a; 输入阶段&#xff1a;用户发起提问。 输出阶段&#xff1a;机器人返回回答。 知识…...

Flink operator实现自动扩缩容

官网文档位置&#xff1a; 1.Autoscaler | Apache Flink Kubernetes Operator 2.Configuration | Apache Flink Kubernetes Operator 1.部署K8S集群 可参照我之前的文章k8s集群搭建 2.Helm安装Flink-Operator helm repo add flink-operator-repo https://downloads.apach…...

数据挖掘——集成学习

数据挖掘——集成学习 集成学习Bagging&#xff1a;有放回采样随机森林 BoostingStacking 集成学习 集成学习&#xff08;Ensemble learning&#xff09;方法通过组合多种学习算法来获得比单独使用任何一种算法更好的预测性能。 动机是为了提高但分类器的性能 Bagging&…...

XGBoost 简介:高效机器学习算法的实用指南

1. 什么是 XGBoost&#xff1f; XGBoost&#xff0c;全称 eXtreme Gradient Boosting&#xff0c;是一种基于 梯度提升决策树&#xff08;GBDT&#xff09; 的高效实现。相比传统的 GBDT&#xff0c;XGBoost 在速度、内存利用和并行化等方面做了很多优化&#xff0c;因此在大规…...

【NLP高频面题 - Transformer篇】什么是缩放点积注意力,为什么要除以根号d?

什么是缩放点积注意力&#xff0c;为什么要除以根号d&#xff1f; 重要性&#xff1a;★★★ Transformer 自注意力机制也被称为缩放点积注意力机制&#xff0c;这是因为其计算过程是先求查询矩阵与键矩阵的点积&#xff0c;再用 d k \sqrt{d_k} dk​ ​ 对结果进行缩放。这…...

HTML——56.表单发送

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>表单发送</title></head><body><!--注意&#xff1a;1.表单接收程序&#xff0c;放在服务器环境中(也就是这里的www文件目录中)2.表单发送地址&#x…...

C++26 函数契约(Contract)概览

文章目录 1. 什么是契约编程?契约编程的三大核心: 2. C26 契约编程的语法语法示例 3. 契约检查模式3.1. default 模式3.2. audit 模式3.3. axiom 模式检查模式的设置 4. 契约编程与传统 assert 的区别示例对比 5. 契约编程的应用场景6. 注意事项7. 示例: 带契约的矩形面积计算…...

【HTML】Day02

【HTML】Day02 1. 列表标签1.1 无序列表1.2 有序列表1.3 定义列表 2. 表格标签2.1 合并单元格 3. 表单标签3.1 input标签基本使用3.2 上传多个文件 4. 下拉菜单、文本域5. label标签6. 按钮button7. div与span、字符实体字符实体 1. 列表标签 作用&#xff1a;布局内容排列整齐…...

Kafka的rebalance机制

1、什么是 rebalance 机制 重平衡&#xff08;rebalance&#xff09;机制规定了如何让消费者组下的所有消费者来分配 topic 中的每一个分区。 2、rebalance 机制的触发条件是什么 &#xff08;1&#xff09;消费者组内成员变更 成员增加&#xff1a;当有新的消费者加入到消费…...

Spring Boot - 日志功能深度解析与实践指南

文章目录 概述1. Spring Boot 日志功能概述2. 默认日志框架&#xff1a;LogbackLogback 的核心组件Logback 的配置文件 3. 日志级别及其配置配置日志级别3.1 配置文件3.2 环境变量3.3 命令行参数 4. 日志格式自定义自定义日志格式 5. 日志文件输出6. 日志归档与清理7. 自定义日…...

【React+TypeScript+DeepSeek】穿越时空对话机

引言 在这个数字化的时代&#xff0c;历史学习常常给人一种距离感。教科书中的历史人物似乎永远停留在文字里&#xff0c;我们无法真正理解他们的思想和智慧。如何让这些伟大的历史人物"活"起来&#xff1f;如何让历史学习变得生动有趣&#xff1f;带着这些思考&…...

2025年贵州省职业院校技能大赛信息安全管理与评估赛项规程

贵州省职业院校技能大赛赛项规程 赛项名称&#xff1a; 信息安全管理与评估 英文名称&#xff1a; Information Security Management and Evaluation 赛项组别&#xff1a; 高职组 赛项编号&#xff1a; GZ032 1 2 一、赛项信息 赛项类别 囚每年赛 □隔年赛&#xff08;□单数年…...

2、蓝牙打印机点灯-GPIO输出控制

1、硬件 1.1、看原理图 初始状态位高电平. 需要驱动PA1输出高低电平控制PA1. 1.2、看手册 a、系统架构图 GPIOA在APB2总线上。 b、RCC使能 GPIOA在第2位。 c、GPIO寄存器配置 端口&#xff1a;PA1 模式&#xff1a;通用推挽输出模式 -- 输出0、1即可 速度&#xff1a;5…...

推荐系统重排:DPP 多样性算法

行列式点过程&#xff08;DPP&#xff09;算法&#xff1a;原理、应用及优化 推荐系统【多样性算法】系列文章&#xff08;置顶&#xff09; 1.推荐系统重排&#xff1a;MMR 多样性算法 2.推荐系统重排&#xff1a;DPP 多样性算法 引言 行列式点过程&#xff08;Determinanta…...

【业务场景】sql server从Windows迁移到Linux

目录 1.背景 2.Linux安装sql server 3.服务器不开端口的问题 4.数据库导入导出问题 1.背景 博主在24年年底接手运维了一个政府的老系统&#xff0c;整个应用和数据库单点部署在一台Windows Server服务器上&#xff0c;数据库选型是经典的老项目标配——sql server。随着近…...

SpringMVC(三)请求

目录 一、RequestMapping注解 1.RequestMapping的属性 实例 1.在这里创建文件&#xff0c;命名为Test: 2.复现-返回一个页面&#xff1a; 创建test界面&#xff08;随便写点什么&#xff09;&#xff1a; Test文件中编写&#xff1a; ​编辑 运行&#xff1a; 3.不返回…...

【HeadFirst系列之HeadFirst设计模式】第1天之HeadFirst设计模式开胃菜

HeadFirst设计模式开胃菜 前言 从今日起&#xff0c;陆续分享《HeadFirst设计模式》的读书笔记&#xff0c;希望能够帮助大家更好的理解设计模式&#xff0c;提高自己的编程能力。 今天要分享的是【HeadFirst设计模式开胃菜】&#xff0c;主要介绍了设计模式的基本概念、设计模…...

Spring线程池优雅关闭

前言 线程池大家一定不陌生&#xff0c;常被用来异步执行一些耗时的任务。但是线程池如何优雅的关闭&#xff0c;却少有人关注。 当 JVM 进程关闭时&#xff0c;你提交到线程池的任务会被如何处理&#xff1f;如何保证任务不丢&#xff1f; ThreadPoolExecutor Java 对线程…...

Spring为什么要用三级缓存解决循环依赖?

1.什么是循环依赖 本文为了方便说明&#xff0c;先设置两个业务层对象&#xff0c;命名为AService和BService。其中Spring是如何把一个Bean对象创建出来的&#xff0c;其生命周期如下&#xff1a; 构造方法–> 不同对象 --> 注入依赖 -->初始化前 --> 初始化后–&…...

【苏德矿高等数学】第4讲:数列极限定义-1

2. 数列极限 数列极限是整个微积分的核心。它的思想贯穿整个微积分之中。 数列极限是最基本的、最核心的、最重要的、最难的。 2.1 数列 【定义】无限排列的一列数 a 1 , a 2 , ⋯ , a n , ⋯ a_1,a_2,\cdots,a_n,\cdots a1​,a2​,⋯,an​,⋯就称为数列&#xff0c;记作 { …...

Go语言的 的并发编程(Concurrency)核心知识

Go语言的并发编程&#xff08;Concurrency&#xff09;核心知识 在现代软件开发中&#xff0c;尤其是处理高并发任务时&#xff0c;优秀的并发编程能力显得尤为重要。Go语言&#xff08;或称Golang&#xff09;是为并发编程而生的一种编程语言&#xff0c;它通过简洁的语法和强…...

Go语言中的逃逸分析:深入浅出

Go语言中的逃逸分析&#xff1a;深入浅出 在Go语言中&#xff0c;逃逸分析&#xff08;Escape Analysis&#xff09;是一个非常重要且强大的编译器优化技术。它帮助编译器决定一个变量是在栈上分配还是在堆上分配&#xff0c;从而影响程序的性能和内存管理。本文将深入探讨Go语…...

flux中的缓存

1. cache&#xff0c;onBackpressureBuffer。都是缓存。cache可以将hot流的数据缓存起来。onBackpressureBuffer也是缓存&#xff0c;但是当下游消费者的处理速度比上游生产者慢时&#xff0c;上游生产的数据会被暂时存储在缓冲区中&#xff0c;防止丢失。 2. Flux.range 默认…...

Vue3中使用 Vue Flow 流程图方法

效果图&#xff1a; 最近项目开发时有一个流程图的功能&#xff0c;需要做流程节点的展示&#xff0c;就搜到了 Vue Flow 这个插件&#xff0c;这个插件总得来说还可以&#xff0c;简单已使用&#xff0c;下边就总结一下使用的方法&#xff1a; Vue Flow官网&#xff1a;https…...

[Effective C++]条款42 typename

本文初发于 “天目中云的小站”&#xff0c;同步转载于此。 条款42 : 了解typename的双重意义 本条款中我们将了解typename的两种使用场景, 对typename的内涵及使用加深认知. template声明式 在template的声明中, template<class T>和template<typename T>都是被允…...

MySQL 8 主从同步配置(Master-Slave Replication)

📋 MySQL 8 主从同步配置(Master-Slave Replication) 🔧 目标: 配置 MySQL 8 主从同步,实现 主库(Master) 处理写操作,从库(Slave) 处理读操作,达到 读写分离 和 高可用性 的目的。 🔑 核心步骤: 配置 主库(Master)配置 从库(Slave)启动主从复制验证主从…...

STM32第十一课:STM32-基于标准库的42步进电机的简单IO控制(附电机教程,看到即赚到)

一&#xff1a;步进电机简介 步进电机又称为脉冲电机&#xff0c;简而言之&#xff0c;就是一步一步前进的电机。基于最基本的电磁铁原理,它是一种可以自由回转的电磁铁,其动作原理是依靠气隙磁导的变化来产生电磁转矩&#xff0c;步进电机的角位移量与输入的脉冲个数严格成正…...

模拟(算法-6)

模拟简介 模拟就是根据题目要求&#xff0c;比着葫芦画瓢&#xff0c;即直接按照题目要求写就行了 考察的是我们的编码能力 步骤&#xff1a; 演草纸上画图模拟&#xff08;重要&#xff09; 代码编写 虽然很多时候此类题比较简单&#xff0c;但是也有例外&#xff0c;如本文第…...

Clickhouse集群部署(3分片1副本)

Clickhouse集群部署 3台Linux服务器&#xff0c;搭建Clickhouse集群3分片1副本模式 1、安装Java、Clickhouse、Zookeeper dpkg -i clickhouse-client_23.2.6.34_amd64.deb dpkg -i clickhouse-common-static_23.2.6.34_amd64.deb dpkg -i clickhouse-server_23.2.6.34_amd64…...

MySQL(六)MySQL 案例

1. MySQL 案例 1.1. 设计数据库 1、首先根据相关业务需求(主要参考输出输入条件)规划出表的基本结构   2、根据业务规则进行状态字段设计   3、预估相关表的数据量进行容量规划   4、确定主键   5、根据对相关处理语句的分析对数据结构进行相应的变更。   设计表的时…...

【网络协议栈】TCP/IP协议栈中重要协议和技术(DNS、ICMP、NAT、代理服务器、以及内网穿透)

每日激励&#xff1a;“请给自己一个鼓励说&#xff1a;Jack我很棒&#xff01;—Jack” 绪论​&#xff1a; 本章是TCP/IP网络协议层的完结篇&#xff0c;本章将主要去补充一些重要的协议和了解一些网络中常见的名词&#xff0c;具体如&#xff1a;DNS、ICMP、NAT、代理服务器…...

NLP中特征提取方法的总结

1. Bag of Words (BOW) 描述&#xff1a;将文本表示为一个词汇表中的词频向量&#xff0c;忽略词的顺序。 优点&#xff1a;实现简单&#xff0c;广泛应用。 缺点&#xff1a;不考虑词序和上下文信息&#xff0c;向量空间维度可能非常大。 应用&#xff1a;文本分类、情感分…...

《HarmonyOS第一课》焕新升级,赋能开发者快速掌握鸿蒙应用开发

随着HarmonyOS NEXT发布&#xff0c;鸿蒙生态日益壮大&#xff0c;广大开发者对于系统化学习平台和课程的需求愈发强烈。近日&#xff0c;华为精心打造的《HarmonyOS第一课》全新上线&#xff0c;集“学、练、考”于一体&#xff0c;凭借多维融合的教学模式与系统课程设置&…...

JMeter + Grafana +InfluxDB性能监控 (二)

您可以通过JMeter、Grafana 和 InfluxDB来搭建一个炫酷的基于JMeter测试数据的性能测试监控平台。 下面&#xff0c;笔者详细介绍具体的搭建过程。 安装并配置InfluxDB 您可以从清华大学开源软件镜像站等获得InfluxDB的RPM包&#xff0c;这里笔者下载的是influxdb-1.8.0.x86_…...

【微服务】3、配置管理

微服务配置管理 已掌握的微服务组件及配置管理问题引出 已掌握注册中心、Openfan、远程调用、负载均衡、网关等组件&#xff0c;具备微服务开发能力&#xff0c;但仍存在其他问题待解决。微服务和网关存在大量配置文件&#xff0c;其中包含很多重复配置&#xff0c;如数据库、日…...

数据结构(顺序表)

文章目录 数据结构概述什么是数据结构数据结构的类型常见的数据结构 线性表概念举例 顺序表基本概念基本操作 完整代码顺序表优缺点总结 数据结构概述 什么是数据结构 数据结构&#xff1a;数据结构就是计算机存储&#xff0c;组织&#xff0c;管理数据的方式方法 数据结构的…...

ARM架构服务器安装部署KVM虚拟化环境

一、查看内核是否支持KVM虚拟化 针对ARM架构服务器&#xff0c;若/dev/kvm 和 /sys/module/kvm任意一个不存在&#xff0c;都说明内核不支持KVM虚拟化 [rootlocalhost ~]# ls -l /dev/kvm crw-rw---- 1 root kvm 10, 232 May 6 09:18 /dev/kvm[rootlocalhost ~]# ls /sys/mo…...

Azkaban其二,具体使用以及告警设置

目录 Azkaban的使用 1、使用Flow1.0(比较老旧&#xff09; 2、Flow2.0的用法 1、小试牛刀 2、YAML格式的数据 3、多任务依赖 4、内嵌流&#xff08;嵌套流&#xff09;案例 5、动态传参 3、Azkaban的报警机制 1&#xff09;邮箱通知 2&#xff09;电话报警机制 4、关…...

不只是mini-react第一节:实现最简单mini-react

项目总结构&#xff1a; ├─ &#x1f4c1;core │ ├─ &#x1f4c4;React.js │ └─ &#x1f4c4;ReactDom.js ├─ &#x1f4c1;node_modules ├─ &#x1f4c1;tests │ └─ &#x1f4c4;createElement.spec.js ├─ &#x1f4c4;App.js ├─ &#x1f4c4;in…...

MySQL数据库备份与恢复策略

数据是企业和应用的核心资产,可靠的备份和恢复策略是确保数据安全性和业务连续性的关键。在本篇文章中,我们将详细介绍 MySQL 数据库的备份和恢复方法,包括逻辑备份、物理备份、自动化备份,以及常见问题的处理方法。 一、逻辑备份 逻辑备份是通过导出数据库的结构和数据生…...