Kafka存储设计深度剖析:日志、索引与文件管理的底层奥秘
引言
在分布式消息系统领域,Kafka凭借卓越的性能与高可靠性占据重要地位,而这一切都离不开其精妙的存储设计。从消息的持久化存储到高效检索,从日志分段管理到数据清理策略,Kafka的存储架构设计巧妙,能够支撑海量消息的有序流转。本文将深入Kafka源码,结合大量流程图、代码示例,重新梳理并优化内容,更清晰、深入地解析其存储设计的核心原理与实现细节。
一、Kafka存储架构全景解析
Kafka的存储体系以主题(Topic)为顶层单位进行组织,每个主题可划分为多个分区(Partition),每个分区又由多个日志分段(LogSegment)构成。这种分层架构设计,使得Kafka既能实现水平扩展以应对海量数据,又能保证数据的有序性与可靠性。其整体架构可用以下流程图直观呈现:
在该架构中,每个分区都是一个有序且不可变的消息序列,新消息持续追加到分区末尾。消费者通过指定偏移量(Offset)读取消息,而Kafka的存储设计,正是为高效存储与快速检索消息而打造。值得注意的是,在存储性能方面,虽然SSD和HDD在顺序读写场景下的性能差距相较于随机读写有所缩小,但SSD凭借其更快的寻址速度和更高的I/O吞吐量 ,在Kafka存储场景中依然能显著提升消息读写效率,尤其是在高并发和频繁滚动日志分段的情况下。
二、日志存储:消息持久化的基石
2.1 日志分段(LogSegment)的精细设计
Kafka将分区内的消息日志切割为多个日志分段,每个分段对应一组文件,包括日志数据文件(.log
)、位移索引文件(.index
)和时间戳索引文件(.timeindex
)。这种设计极大地方便了日志的管理、清理与快速检索。以下是日志分段的核心代码实现:
public class LogSegment {// 日志数据文件private final File logFile;// 位移索引文件private final File offsetIndexFile;// 时间戳索引文件private final File timeIndexFile;// 该分段的基偏移量private final long baseOffset;public LogSegment(File logFile, File offsetIndexFile, File timeIndexFile, long baseOffset) {this.logFile = logFile;this.offsetIndexFile = offsetIndexFile;this.timeIndexFile = timeIndexFile;this.baseOffset = baseOffset;}// 向日志分段追加消息public long append(MemoryRecords records) throws IOException {try (FileChannel channel = new FileOutputStream(logFile, true).getChannel()) {return channel.write(records.buffer());}}
}
每个日志分段都有一个基偏移量(baseOffset
),它代表该分段中第一条消息的偏移量。随着消息不断写入,当日志分段达到配置的最大大小(由log.segment.bytes
参数决定),或者距离上次滚动的时间达到配置间隔(由log.roll.hours
参数决定)时,Kafka会创建新的日志分段,原分段转为只读状态,等待后续清理或压缩处理。
2.2 消息追加与文件写入流程
当生产者将消息发送至Kafka,最终由分区的Leader副本负责将消息写入日志。Partition
类中的appendRecords
方法,承担着将消息追加到当前活跃日志分段的重要任务,其代码如下:
public class Partition {private final LogSegmentManager segmentManager;public LogAppendInfo appendRecords(MemoryRecords records) {// 获取当前活跃的日志分段LogSegment segment = segmentManager.activeSegment();// 将消息追加到日志分段,并获取写入的偏移量long offset = segment.append(records);return new LogAppendInfo(offset, System.currentTimeMillis());}
}
在消息写入过程中,Kafka采用顺序写入磁盘的策略,这是其实现高性能存储的关键。相较于随机写入,顺序写入能充分利用磁盘特性,大幅提升写入速度。以机械硬盘为例,顺序写入时磁头无需频繁寻道,减少了寻道时间;而SSD虽然没有寻道问题,但顺序写入也能更好地利用其闪存特性,降低写入放大效应,从而提高整体写入性能和使用寿命 。
三、索引机制:快速检索的核心
3.1 位移索引(Offset Index)的高效查找
位移索引文件(.index
)记录了消息偏移量(Offset)与物理文件位置的映射关系,借助它可快速定位目标消息在日志数据文件中的具体位置。位移索引的每个条目包含两个字段:相对偏移量(相对于日志分段基偏移量)和物理文件位置(字节偏移量),其数据结构示意如下:
+----------------+----------------+
| 相对偏移量(4B) | 物理位置(4B) |
+----------------+----------------+
| 100 | 8192 |
+----------------+----------------+
| 200 | 16384 |
+----------------+----------------+
OffsetIndex
类中的lookup
方法,实现了根据偏移量查找物理位置的功能,具体代码如下:
public class OffsetIndex {private final ByteBuffer indexBuffer;public int lookup(long offset) {int low = 0;int high = (indexBuffer.capacity() / INDEX_ENTRY_SIZE) - 1;while (low <= high) {int mid = low + ((high - low) / 2);long baseOffset = getBaseOffset(mid);if (offset < baseOffset) {high = mid - 1;} else {low = mid + 1;}}// 返回插值计算后的物理位置return interpolatePosition(low - 1, offset);}
}
该方法运用二分查找算法,将查找时间复杂度降低至O(log n),能够快速、精准地定位到目标偏移量对应的物理位置,极大提升了消息检索效率。
3.2 时间戳索引(TimeIndex)的时间范围查询
时间戳索引文件(.timeindex
)建立了时间戳与消息偏移量的对应关系,支持根据时间范围快速筛选相关消息。其每个条目包含时间戳和对应的消息偏移量两个字段。核心代码实现如下:
public class TimeIndex {private final ByteBuffer indexBuffer;public long lookup(long timestamp) {int low = 0;int high = (indexBuffer.capacity() / INDEX_ENTRY_SIZE) - 1;while (low <= high) {int mid = low + ((high - low) / 2);long indexTimestamp = getTimestamp(mid);if (timestamp < indexTimestamp) {high = mid - 1;} else {low = mid + 1;}}return getOffset(low - 1);}
}
同样基于二分查找算法,时间戳索引实现了高效的时间戳范围查询,为基于时间的消息检索需求提供了有力支持,例如在查询某段时间内产生的消息场景中,能快速定位到相关消息的偏移量,进而获取消息内容。
四、文件管理与清理:存储的有序维护
4.1 日志分段滚动机制
Kafka通过日志分段滚动机制控制日志文件大小,当满足以下任意条件时,便会触发新日志分段的创建:
- 当前日志分段达到配置的最大大小(由
log.segment.bytes
参数控制)。 - 距离上次滚动的时间达到配置间隔(由
log.roll.hours
参数控制)。
LogSegmentManager
类中的maybeRoll
方法,负责检查是否需要进行日志分段滚动,代码如下:
public class LogSegmentManager {private final int segmentSize;private final long rollIntervalMs;private LogSegment activeSegment;public void maybeRoll() {if (activeSegment.sizeInBytes() >= segmentSize ||System.currentTimeMillis() - activeSegment.rollTimeMs() >= rollIntervalMs) {roll();}}private void roll() {long newBaseOffset = activeSegment.nextOffset();LogSegment newSegment = createSegment(newBaseOffset);activeSegment = newSegment;}
}
滚动操作完成后,新消息将写入新创建的日志分段,原分段进入只读状态,不再接收新消息写入。
4.2 日志清理策略详解
Kafka提供删除(Delete)和压缩(Compact)两种日志清理策略,以满足不同业务场景的需求。
- 删除策略:按照设定规则删除过期的日志分段。可通过
log.retention.hours
(按时间删除)、log.retention.bytes
(按大小删除)等参数进行配置。LogCleaner
类中的deleteExpiredSegments
方法实现了删除过期分段的逻辑,代码如下:
public class LogCleaner {public void deleteExpiredSegments(Log log) {List<LogSegment> segments = log.segments();long now = System.currentTimeMillis();for (LogSegment segment : segments) {if (now - segment.creationTimeMs() >= log.retentionMs()) {segment.delete();}}}
}
- 压缩策略:旨在保留每个消息键(Key)的最新值,删除旧的重复键值消息。
Log
类中的compact
方法实现了日志压缩功能,具体流程如下:
public class Log {public void compact() {Map<ByteBuffer, Long> offsetMap = new HashMap<>();for (LogSegment segment : segments()) {try (LogSegmentReader reader = segment.reader()) {while (reader.hasNext()) {Record record = reader.next();ByteBuffer key = record.key();offsetMap.put(key, record.offset());}}}// 根据最新偏移量重新写入消息// 遍历offsetMap,将每个键对应的最新消息重新写入日志for (Map.Entry<ByteBuffer, Long> entry : offsetMap.entrySet()) {Long offset = entry.getValue();// 定位到该偏移量对应的消息,写入新的日志文件}}
}
压缩策略适用于需要保留最新状态的场景,如数据库变更日志,能有效节省存储空间,同时确保关键信息的完整性。
五、存储性能优化与关键配置
5.1 关键配置参数解析
log.segment.bytes
:决定单个日志分段的最大大小,直接影响日志滚动频率与文件管理。若设置过小,会导致日志分段频繁滚动,增加文件管理开销;若设置过大,可能使单个文件过大,影响查询和清理效率。log.retention.hours
:定义日志保留时间,超过该时长的日志分段将被删除。合理设置此参数,可在满足业务数据保留需求的同时,控制存储成本。log.cleaner.enable
:用于开启或关闭日志压缩功能。开启后,能节省存储空间,但会增加一定的计算开销,适用于对存储空间敏感且需要保留最新状态的场景。index.interval.bytes
:控制位移索引和时间戳索引的写入间隔,影响索引文件大小与查询性能。较小的间隔可提高查询精度,但会增大索引文件占用空间;较大的间隔则反之。
5.2 性能优化实战策略
- 索引参数调整:根据业务查询需求,合理设置
index.interval.bytes
参数。对于查询精度要求高的场景,可适当减小该值;对于存储空间紧张且查询精度要求相对较低的场景,可增大该值,平衡索引文件大小与查询性能。 - 清理策略选择:依据业务特点选择合适的日志清理策略。对于实时性要求高、仅需保留近期数据的场景,采用删除策略即可;对于需要保留消息最新状态、存储空间有限的场景,启用压缩策略更为合适。
通过重新梳理与深入优化,我们对Kafka的存储设计有了更清晰、更全面的认识。从存储架构到日志、索引、文件管理,再到性能优化,每一个环节的设计都凝聚着精巧的构思。这些设计不仅保障了Kafka在海量消息处理下的高效与稳定,也为开发者在实际应用中进行存储优化提供了丰富的思路和实践指导。
相关文章:
Kafka存储设计深度剖析:日志、索引与文件管理的底层奥秘
引言 在分布式消息系统领域,Kafka凭借卓越的性能与高可靠性占据重要地位,而这一切都离不开其精妙的存储设计。从消息的持久化存储到高效检索,从日志分段管理到数据清理策略,Kafka的存储架构设计巧妙,能够支撑海量消息…...
将多个Excel合并到一个Excel中的方法
今天遇到这么一个问题,需要将多个Excel表格中的数据汇总表,合并在一个Excel中,并且显示一致。 因此编写了以下代码来解决这个问题, 1.在Excel中按AltF11,快速调出命令控制台 2.工具栏选择插入——模块——将以下脚本…...
Debian配置Redis主从、哨兵
前言 Redis的下载安装可参考Centos安装配置Redis6.x,Centos和Debian的步骤基本类似,或自行在网上搜索相关资料 注意:远程连接需放开相应端口 主从 搭建一个一主二从的主从模式 处理conf文件 #进入redis所在目录 cd /tools/redis/redis6 …...
OpenSSL引擎 + PKCS11 + SoftHSM2认证
OpenSSL引擎 PKCS11 SoftHSM2 前言:金融级安全的基石 在金融、军工等高安全领域,硬件安全模块(HSM) 是保护加密密钥的黄金标准。本文将深度剖析HSM核心组件libpkcs11.so的工作原理,并手把手教你搭建基于SoftHSM2的…...
flex布局 项目属性
<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>flex布局 项目属性</title> <link href"css/k.css" rel"stylesheet" /> </head> <bod…...
流水表延迟处理方案设计
**### 流水表延迟处理方案设计 针对你的场景(流水表插入记录,当type4时需要1秒后处理),结合现有技术栈(JDK8、MySQL、定时任务、Redis、RabbitMQ),我推荐以下几种可行方案: 一、方…...
密室出逃消消乐小游戏微信流量主小程序开源
这个密室出逃消消乐小游戏采用了微信小程序的标准目录结构,包含以下核心功能: 游戏界面:6x6 的网格布局,随机生成不同类型的物品 游戏逻辑:交换相邻物品,消除三个或以上相同类型的物品 计分系统:…...
Docker 日志
Docker 日志是排查容器故障、监控运行状态的重要工具。下面从 日志查看命令、详解字段、日志驱动、最佳实践 四个方面给你详细解析。 一、最常用日志命令 1. 查看容器日志(默认 stdout、stderr) docker logs <container_name|container_id>2. 实…...
嵌入Linux快速入门第3篇
01_嵌入式Linux开发环境介绍 在Windows环境下的操作: 02_配置VMware使用双网卡之NAT网卡 虚拟机内部有两个网卡,一个是NAT网卡,另外一个是桥接网卡。NAT网卡用来保证Ubuntu可以上网,桥接网卡用来保证Ubuntu可以和开发板进行数据…...
详解鸿蒙Next仓颉开发语言中的全屏模式
大家好,今天跟大家分享一下仓颉开发语言中的全屏模式。 和ArkTS一样,仓颉的新建项目默认是非全屏模式的,如果你的应用颜色比较丰富,就会发现屏幕上方和底部的留白,这是应用自动避让了屏幕上方摄像头区域和底部的导航条…...
Oracle/MySQL/SqlServer/PostgreSQL等数据库的数据类型映射以及各版本数据类型情况说明
1 引言 近期工作聚焦于跨数据库系统的数据类型兼容性研究,旨在解决多源异构数据迁移、系统集成及版本升级中的类型映射难题。具体任务包括:1)建立主流数据库(如MySQL、Oracle、PostgreSQL、SQL Server等)的数据类型映射…...
新生活的开启:从 Trae AI 离开后的三个月
很久没有写文章了,想借着入职新公司一个月的机会,和大家唠唠嗑。 离职 今年2月份我从字节离职了,结束了四年的经历,当时离开的核心原因是觉得加班时间太长了,平均每天都要工作15,16个小时,周末…...
背包问题概论(01背包,完全背包,多重背包)DP
背包问题概论(01背包,完全背包,多重背包)DP 背包问题一种经典的组合优化问题,主要用于在有限的容量下选择物品以最大化总价值。它分为几种类型: ①:0/1背包问题:每种物品只能选择…...
攻克SQL审核“最后堡垒”!PawSQL首发T-SQL存储过程深度优化引擎
为什么存储过程审核那么难? 存储过程将数据操作逻辑固化在数据库层,一次编译、多次执行,既能大幅提升性能,也能通过权限隔离增强安全。然而,正因其逻辑复杂、分支众多,存储过程内部的 SQL 审核与优化常常成…...
Stable Diffusion 实战-手机壁纸制作 第二篇:优化那些“崩脸”和“马赛克”问题,让图像更加完美!
欢迎回来!在《StableDiffusion实战-手机壁纸制作》系列的第一篇中,我们成功完成了基础操作,制作出了令人炫目的手机壁纸。 今天,我们将进入一个更高阶的领域——优化处理。因为谁不想让生成的艺术品更完美呢?尤其是避免“崩脸”和“马赛克”这种让人抓狂的问题! 创作的路…...
Kafka消费者客户端源码深度解析:从架构到核心流程
在Kafka生态系统中,消费者客户端作为数据消费的入口,其设计与实现直接影响数据处理的效率和可靠性。本文将深入Kafka消费者客户端源码,通过核心组件解析、流程拆解与源码分析,揭示其高性能消费背后的技术奥秘,并辅以架…...
Linux进程间通信:从入门到精通(2)
嘿,小伙伴!今天我们来聊聊Linux系统中一个超级重要的话题——进程间通信(IPC)。看到"进程间通信"这个词,别急着打哈欠,这可是Linux内核中的"社交达人",让进程们能够愉快地交…...
从源码到生产:Apache 2.4.57 自动化安装实战指南(附脚本)
引言:为何选择源码安装 Apache? 在服务器运维场景中,源码编译安装 Apache HTTP Server 是实现精细化配置的重要方式。相比包管理器安装,源码安装可自定义模块组合、适配特定依赖环境,并精确控制版本。本文将通过自动化…...
CMake实践:指定gcc版本编译和交叉编译
目录 1.指定gcc版本编译 1.1.通过CMake参数来实现 1.2.使用 RPATH/RUNPATH 直接指定库路径 1.3.使用符号链接和 LD_LIBRARY_PATH 1.4.使用 wrapper 脚本封装 LD_LIBRARY_PATH 2.交叉编译 2.1.基本用法 2.2.工具链文件关键配置 2.3.多平台工具链示例 2.4.注意事项 2.…...
【MySQL基础】MySQL内置函数全面解析:提升你的数据库操作效率
MySQL学习: https://blog.csdn.net/2301_80220607/category_12971838.html?spm1001.2014.3001.5482 前言: MySQL提供了丰富的内置函数来帮助开发者高效地处理数据。这些函数覆盖了字符串操作、数值计算、日期时间处理、流程控制等多个方面。本文将全面…...
OpenCV CUDA模块设备层-----在GPU上计算两个uchar1类型像素值的反正切(arctangent)比值函数atan2()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 对输入的两个 uchar1 像素值 a 和 b,先分别归一化到 [0.0, 1.0] 浮点区间,然后计算它们的 四象限反正切函数。 函数原型…...
unity 半透明描线shader
效果如图 Shader "Custom/TransparentWithOutline_Fixed" {Properties{// 主材质属性_Color ("Main Color", Color) (1,1,1,1)_MainTex ("Base (RGB) Trans (A)", 2D) "white" {}_Glossiness ("Smoothness", Range(0,1)…...
react中使用antd的form表单去受控switch时初始值没有正确显示
解决方案 antd内api中有valuePropName熟悉 只需正常绑定当前元素触发事件即可...
01__QT的背景介绍和工程创建
一、QT软件的安装 1、qt的背景介绍 Qt 是一个跨平台的 图形界面库(重量级),1994年由罗威troll tech公司出品,它集成了网络、数据库、串口通信协议(RS232,蓝牙,NFC)、打印、PDF生成…...
Java Map 深度解析
一、HashMap 底层实现详解 1. 核心数据结构 HashMap 在 JDK 8 中的底层结构是 数组 链表 红黑树,其核心成员变量包括: transient Node<K,V>[] table;:哈希桶数组transient int size;:实际键值对数量int threshold;&…...
异地组网工具
目前手头上两台服务器(一台主力,一台有gpu用来跑点深度学习任务),两台pc(一台是主力,一台是便携碎片化时间随时赶工用); 之前组网的时候,用zerotiertailscale࿰…...
我们为什么要模拟
大约 25 年前,当我开始从事高速 PCB 设计时,速度很慢,层数少,介电常数和损耗角正切很高,设计裕量很宽,铜粗糙度无关紧要,玻璃编织样式也无关紧要。我们称电介质为“FR-4”,它们的特性…...
MySQL 三大日志:Redo、Undo 与 Binlog 详解
写在前面 关于三大日志,博主看了无数视频和文章,也是总结的非常精辟了! 在 MySQL 数据库的运行机制中,Redo Log、Undo Log 和 Binlog 起着至关重要的作用,它们各司其职,共同保障数据库的数据安全、事务一…...
JMeter-SSE响应数据自动化3.0
背景 此次因为多了一些需要过滤排除的错误(数量很少),还需要修改下JMeter的jtl文件输出数据(后续统计数据需要) 所以只涉及到JSR脚本的一些改动(此部分改动并不会影响到JMeter的HTML报告) 改动 主要通过设置JMeter中prev输出数据变量threadN…...
C#上位机通过WebApi访问WinCC
在智能工厂架构中,WinCC作为SCADA一级,负责着与上级MES和下级PLC及其他现场组件的联系。与下层通信,WinCC支持S7、MC、Modbus TCP、OPC等多种接口和协议。对上层通信,WinCC从7.5 SP2开始支持REST Api这种Web接口方式。 今天跟大家…...
【深度学习新浪潮】什么是端侧AI?
什么是端侧AI? 端侧AI的定义 端侧AI(Edge AI)是指在终端设备(如手机、智能家居、穿戴设备等)本地运行的人工智能技术,无需将数据上传至云端服务器,直接在设备端完成数据处理、模型推理和决策。其核心优势在于低延迟、高隐私性、减少网络依赖,尤其适合对实时性和数据安…...
Postman 的 Jenkins 管理 - 自动构建
目录 一、环境准备 创建 Postman 集合和环境 二、postman Postman 集合和环境并导出 1. 打开已完成并测试无误的 postman 项目脚本。 再次执行测试。 编辑2. 导出( 测试用例集、环境变量 两个文件)**“不 支 持 中 文”** —— 全部改成英文&a…...
HomeBrew MAC PRO 安装教程
1、检查xcode工具 这个东西一般是有的,命令后输入以下内容即可 xcode-select --install如安装,结果为: 2、安装HomeBrew 方式1(推荐) /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebr…...
多模态大语言模型arxiv论文略读(129)
Task Success Prediction for Open-Vocabulary Manipulation Based on Multi-Level Aligned Representations ➡️ 论文标题:Task Success Prediction for Open-Vocabulary Manipulation Based on Multi-Level Aligned Representations ➡️ 论文作者:M…...
Android 实现 Toast 显示重叠问题,有效提升用户体验
Android 实现 Toast 显示重叠问题 在 Android 开发中,Toast 是一个非常常用的提示工具,能够为用户提供短暂的信息展示。然而,Toast 的默认实现中,存在一个体验上的问题,当多次触发 Toast 显示时,会导致多个…...
Spring Boot + MyBatis + Vue:构建高效全栈应用的实战指南
一、项目需求分析 假设我们需要开发一个简单的任务管理系统,用户可以通过该系统创建、查看和删除任务。以下是项目的基本需求: 用户管理:用户可以注册和登录系统。 任务管理:用户可以创建、查看和删除任务。 数据持久化&#x…...
语音情感识别:CNN-LSTM 和注意力增强 CNN-LSTM 模型的比较分析
摘要: 语音情感识别 (SER) 技术可帮助计算机理解语音中的人类情感,这在推进人机交互和心理健康诊断方面占据了关键地位。本研究的主要目标是通过创新的深度学习模型提高 SER 的准确性和泛化性。尽管它在人机交互和心理健康诊断等各个领域都很…...
Cursor Pro取消500次请求限制,无限用的体验更好了吗?
目录 前言 一、发生了什么?从"限量"到"无限"的升级 1.1 "顶配" Ultra 套餐的登场 1.2 Pro 套餐的"静默升级" 1.3 新旧方案对比 二、"无限"背后的体验:一个开发者的真实感受 三、Cursor 为何要…...
视频汇聚EasyCVR平台v3.7.2发布:新增全局搜索、播放器默认解码方式等4大功能
EasyCVR视频汇聚平台带着全新的v3.7.2版本重磅登场!此次升级,绝非简单的功能堆砌,而是从用户体验、操作效率以及系统性能等多维度进行的深度优化与革新,旨在为大家带来更加强大、稳定且高效的视频监控管理体验。 一、全局功能搜索…...
2025年AI热潮:开发一款聚合AI系统,包含AI对话、视频、数字人、办公、客服、剪辑为一体的ai智能系统有多强
前言,我们了解了网上比较火的ai平台,比如: 抖音豆包AI、百度AI、阿里巴巴AI、腾讯AI、华为AI、DeepSeek、ChatGPT、文心一言、通义千问 一、系统概述 本聚合AI系统是一个集AI对话、图片生成、视频生成、视频剪辑、数字人创作、音乐制作、办公…...
DeepSeek 助力 Vue3 开发:打造丝滑的日历(Calendar),日历_项目里程碑示例(CalendarView01_22)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
AWS数据库迁移实战:本地MySQL零停机上云方案
一、迁移场景 本地环境:自建MySQL 5.7(数据量500GB),业务要求迁移停机时间<5分钟 目标架构: 二、迁移四步法 步骤1:环境准备(耗时30分钟) 1.1 创建Aurora MySQL # AWS CLI创…...
windows汇编
今天发现一个很好的视频,讲windows汇编/调试等。是个老太太讲的,但是讲的真好。 Create/Assemble/Link x64 Windows asm exe, Debugging Tools for Windows (WinDbg), stack shadow store. 照例边看边记录边实验。 1. install visual studio 2. instal…...
用 python 开发一个可调用工具的 AI Agent,实现电脑配置专业评价
在人工智能时代,AI Agent凭借其强大的任务处理能力,逐渐成为开发人员手中的得力工具。今天,我们就来一起动手,用Python打造一个能够调用工具的AI Agent,实现根据电脑信息对电脑配置进行专业评价的功能。 一、项目创建…...
Java自定义线程池(ThreadPoolExecutor)
Java线程池使用示例 下面将展示如何使用自定义线程池(ThreadPoolExecutor)来执行任务,包括提交Runnable任务、Callable任务,处理拒绝策略以及关闭线程池。 import java.util.concurrent.*;public class ThreadPoolDemo {// 自定义线程工厂(…...
386. 字典序排数
386. 字典序排数 理解题目要求 题目要求我们生成从 1 到 n 的整数的字典序排列,并且要求: 时间复杂度 O(n):不能使用直接排序(通常指的是使用标准的排序算法(如快速排序、归并排序、堆排序等)对数…...
Kaggle-Plant Seedlings Classification-(多分类+CNN+图形处理)
Plant Seedlings Classification 题意: 就是给出很多图片,预测出图片中的小草是什么类型的。 数据处理: 1.去除图片背景,只保留物体。 2.图片数据加强。 建立模型: 1.CNN的Sequential(),多层卷积块和…...
Android 应用多语言与系统语言偏好设置指南
文章目录 创建语言包以中文包为例 以系统为主导的“应用语言偏好设置”从你的应用调到“应用语言偏好设置” 创建语言包 我们可以使用一个很蹩脚的办法来实现: 以中文包为例 values是默认values-zh-rCN是简体中文values-zh-rTW是繁体(台湾省ÿ…...
Excel学习01
Excel是微软公司开发的一款电子表格软件,可以广泛应用于数据处理、统计分析、图表制作、财务管理和自动化办公领域等。Excel在实际工作中使用的非常广泛,为此本次开始针对excel的使用进行一系列讲解。 展示使用的软件是WPS,它和excel的使用方…...
Loggers 配置解析(log4j.xml)
Loggers 配置解析 我们通过下面的例子来理解 log4j 的 Loggers 配置是如何决定日志输出规则的。 <Loggers><!-- 根Logger:全局配置 --><Root level"debug"><AppenderRef ref"consoleAppender" level"info"/&g…...