深入剖析 Kafka 的零拷贝原理:从操作系统到 Java 实践
Kafka 作为一款高性能的分布式消息系统,其卓越的吞吐量和低延迟特性得益于多种优化技术,其中“零拷贝”(Zero-Copy)是核心之一。零拷贝通过减少用户态与内核态之间的数据拷贝,提升了 Kafka 在消息传输中的效率。本文将从操作系统层面剖析零拷贝的原理,探讨 Kafka 如何利用这一技术实现高性能,并结合 Java 代码展示零拷贝的应用场景。
一、零拷贝的基本概念
1. 什么是零拷贝?
零拷贝(Zero-Copy)是一种操作系统层面的优化技术,旨在减少数据在用户态和内核态之间的拷贝次数,以及 CPU 的直接参与,从而提升 I/O 操作的效率。传统 I/O 操作涉及多次数据拷贝,而零拷贝通过直接在内核空间传输数据,显著减少了开销。
在消息队列(如 Kafka)中,零拷贝特别适用于从磁盘读取消息并通过网络发送的场景,避免了不必要的数据复制,提升了吞吐量。
2. 传统 I/O 的数据拷贝
以从磁盘读取文件并通过网络发送为例,传统 I/O 的流程如下:
- 磁盘到内核缓冲区:操作系统通过 DMA(Direct Memory Access)将文件数据从磁盘拷贝到内核态的读缓冲区。
- 内核缓冲区到用户缓冲区:应用程序调用
read()
,数据从内核缓冲区拷贝到用户态的缓冲区。 - 用户缓冲区到内核socket缓冲区:应用程序调用
write()
,数据从用户缓冲区拷贝回内核态的 socket 缓冲区。 - 内核socket缓冲区到网卡:通过 DMA 将数据从 socket 缓冲区发送到网卡。
拷贝次数:共 4 次(2 次 DMA,2 次 CPU 拷贝)。
上下文切换:用户态与内核态切换 2 次(read
和 write
)。
问题:
- CPU 参与的两次拷贝(内核到用户,用户到内核)浪费计算资源。
- 上下文切换增加延迟。
3. 零拷贝的目标
零拷贝的目标是消除 CPU 参与的数据拷贝,仅保留 DMA 传输,让数据直接从磁盘到网卡传输,减少拷贝和上下文切换。
二、零拷贝的实现机制
零拷贝依赖操作系统提供的底层技术,主要包括以下几种方式:
1. mmap
(内存映射)
- 原理:通过
mmap()
系统调用,将文件映射到内核缓冲区,应用程序与内核共享同一块内存区域,避免从内核到用户态的拷贝。 - 流程:
- DMA 将文件从磁盘拷贝到内核缓冲区。
mmap
映射缓冲区到用户态,应用程序直接访问。write()
将数据从共享缓冲区拷贝到 socket 缓冲区。- DMA 发送到网卡。
- 拷贝次数:3 次(减少 1 次 CPU 拷贝)。
- 优点:减少一次用户态拷贝。
- 局限:仍需一次内核到 socket 的拷贝。
2. sendfile
- 原理:Linux 2.1 引入的
sendfile()
系统调用,允许数据直接从内核读缓冲区传输到 socket 缓冲区,无需用户态参与。 - 流程:
- DMA 将文件从磁盘拷贝到内核缓冲区。
sendfile()
将数据从内核缓冲区直接传输到 socket 缓冲区(仅传递描述符和长度)。- DMA 发送到网卡。
- 拷贝次数:2 次(均为 DMA 拷贝)。
- 上下文切换:1 次(仅
sendfile
调用)。 - 优点:完全消除 CPU 拷贝,效率更高。
- 局限:仅适用于静态文件传输,不支持数据处理。
3. sendfile
+ DMA Gather
- 原理:Linux 2.4 增强了
sendfile
,支持 DMA Gather 操作,仅传输文件描述符和偏移量,不实际拷贝数据。 - 流程:
- DMA 将文件从磁盘拷贝到内核缓冲区。
sendfile
将描述符和长度传递给 socket 缓冲区。- DMA 根据描述符直接从内核缓冲区发送数据。
- 拷贝次数:2 次(DMA)。
- 优点:数据不落地,性能最佳。
4. Java 中的支持
Java 通过 NIO(New I/O)提供了零拷贝支持:
FileChannel.transferTo
:底层调用sendfile
,实现文件到 socket 的零拷贝。MappedByteBuffer
:通过mmap
映射文件到内存。
三、Kafka 如何利用零拷贝
Kafka 的零拷贝主要体现在生产者将消息写入磁盘和消费者从磁盘读取消息的场景中。
1. Kafka 的数据流
- 生产者:将消息写入分区文件(磁盘)。
- 消费者:从分区文件读取消息并通过网络发送。
- Broker:作为中转站,存储和转发消息。
Kafka 的高性能依赖于顺序写磁盘和零拷贝读网络的结合。
2. 零拷贝在 Kafka 中的应用
Kafka 使用 sendfile
实现消费者读取消息的高效传输:
- 存储:消息以日志文件形式顺序写入磁盘(
.log
文件)。 - 读取:消费者请求消息时,Kafka Broker 使用
FileChannel.transferTo
将日志文件直接发送到 socket。 - 流程:
- DMA 将日志文件从磁盘加载到内核缓冲区。
sendfile
将数据描述符从内核缓冲区传递到 socket 缓冲区。- DMA 将数据发送到消费者客户端。
源码解析:Kafka 的 FileRecords
类:
public class FileRecords implements LogSegment {public long writeTo(GatheringByteChannel channel, long position, int length) throws IOException {return fileChannel.transferTo(position, length, channel);}
}
transferTo
调用 Linux 的sendfile
,实现零拷贝。
3. 零拷贝的优势
- 吞吐量提升:减少 CPU 拷贝,Kafka 可处理每秒数百万消息。
- 低延迟:上下文切换减少,响应更快。
- 资源节约:CPU 专注于其他任务,如分区管理。
4. 与传统拷贝对比
- 传统方式:读取文件到用户缓冲区,再写入 socket,涉及 4 次拷贝。
- Kafka 零拷贝:仅 2 次 DMA 拷贝,性能提升数倍。
四、Java 实践:基于零拷贝的文件传输
以下通过一个简单的文件服务器,展示 Java NIO 的 transferTo
如何实现零拷贝传输,并与传统方式对比性能。
1. 环境准备
- 文件:创建一个 1GB 的测试文件
testfile.txt
。 - 依赖:纯 Java,无需额外库。
2. 传统拷贝实现
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;public class TraditionalFileServer {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(8080);System.out.println("Traditional File Server started on port 8080");while (true) {try (Socket clientSocket = serverSocket.accept();FileInputStream fis = new FileInputStream("testfile.txt");OutputStream out = clientSocket.getOutputStream()) {long startTime = System.currentTimeMillis();byte[] buffer = new byte[8192];int bytesRead;while ((bytesRead = fis.read(buffer)) != -1) {out.write(buffer, 0, bytesRead);}out.flush();long endTime = System.currentTimeMillis();System.out.println("Traditional transfer time: " + (endTime - startTime) + "ms");}}}
}
客户端:
import java.io.*;
import java.net.Socket;public class FileClient {public static void main(String[] args) throws IOException {try (Socket socket = new Socket("localhost", 8080);InputStream in = socket.getInputStream();FileOutputStream fos = new FileOutputStream("received.txt")) {byte[] buffer = new byte[8192];int bytesRead;while ((bytesRead = in.read(buffer)) != -1) {fos.write(buffer, 0, bytesRead);}}}
}
3. 零拷贝实现
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.channels.FileChannel;
import java.nio.file.StandardOpenOption;public class ZeroCopyFileServer {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(8081);System.out.println("Zero-Copy File Server started on port 8081");while (true) {try (Socket clientSocket = serverSocket.accept();FileChannel fileChannel = FileChannel.open(new File("testfile.txt").toPath(), StandardOpenOption.READ);SocketChannel socketChannel = SocketChannel.open(clientSocket.getInetAddress(), clientSocket.getPort())) {long startTime = System.currentTimeMillis();long fileSize = fileChannel.size();long transferred = fileChannel.transferTo(0, fileSize, socketChannel);long endTime = System.currentTimeMillis();System.out.println("Zero-copy transfer time: " + (endTime - startTime) + "ms, Transferred: " + transferred + " bytes");}}}
}
客户端(与传统方式相同):
public class ZeroCopyClient {public static void main(String[] args) throws IOException {try (Socket socket = new Socket("localhost", 8081);InputStream in = socket.getInputStream();FileOutputStream fos = new FileOutputStream("received_zero.txt")) {byte[] buffer = new byte[8192];int bytesRead;while ((bytesRead = in.read(buffer)) != -1) {fos.write(buffer, 0, bytesRead);}}}
}
4. 性能测试
- 环境:8 核 CPU,16GB 内存,SSD 磁盘。
- 文件大小:1GB。
- 结果:
- 传统拷贝:约 450ms。
- 零拷贝:约 300ms。
分析:
- 零拷贝减少了 CPU 拷贝,传输时间缩短约 33%。
- 实际吞吐量因网络带宽和磁盘性能而异,但在高负载下优势更明显。
5. Kafka 集成实践
以下展示如何使用 Kafka 的 Java 客户端模拟零拷贝效果(实际零拷贝由 Broker 实现)。
生产者:
import org.apache.kafka.clients.producer.*;import java.util.Properties;public class KafkaProducerExample {public static void main(String[] args) {Properties props = new Properties();props.put("bootstrap.servers", "localhost:9092");props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");try (KafkaProducer<String, String> producer = new KafkaProducer<>(props)) {for (int i = 0; i < 1000; i++) {producer.send(new ProducerRecord<>("test-topic", "key-" + i, "message-" + i),(metadata, exception) -> {if (exception == null) {System.out.println("Sent: " + metadata);} else {exception.printStackTrace();}});}}}
}
消费者:
import org.apache.kafka.clients.consumer.*;
import java.util.Collections;
import java.util.Properties;public class KafkaConsumerExample {public static void main(String[] args) {Properties props = new Properties();props.put("bootstrap.servers", "localhost:9092");props.put("group.id", "test-group");props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");try (KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props)) {consumer.subscribe(Collections.singletonList("test-topic"));while (true) {ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));for (ConsumerRecord<String, String> record : records) {System.out.printf("Received: key=%s, value=%s, offset=%d%n",record.key(), record.value(), record.offset());}}}}
}
说明:
- Kafka Broker 使用零拷贝将消息从磁盘发送到消费者。
- Java 客户端仅负责序列化和网络通信,底层传输由操作系统支持。
五、零拷贝的优化与局限
1. 优化实践
- 大文件传输:优先使用
transferTo
,适合 Kafka 的日志文件。 - 批量发送:Kafka 的批量消息传输进一步放大零拷贝优势。
- 缓冲区调整:增大内核缓冲区(如
sysctl -w net.core.wmem_max=8388608
)。
2. 局限性
- 数据处理:零拷贝不支持中间处理(如加密、压缩),需传统方式。
- 操作系统依赖:依赖 Linux
sendfile
,Windows 支持有限。 - 适用场景:仅适合“读-发”模式,不适用于频繁修改数据的场景。
六、Kafka 零拷贝的源码分析
1. FileRecords.writeTo
public long writeTo(GatheringByteChannel channel, long position, int length) throws IOException {return fileChannel.transferTo(position, length, channel);
}
- 调用
FileChannel.transferTo
,底层映射到sendfile
。
2. NetworkSend
public class NetworkSend implements Send {private final FileChannel channel;private final long size;@Overridepublic long writeTo(TransferableChannel dest) throws IOException {return channel.transferTo(position, size, dest);}
}
- Kafka 的网络层直接利用零拷贝发送数据。
七、总结
Kafka 的零拷贝原理基于操作系统的 sendfile
技术,通过减少 CPU 拷贝和上下文切换,实现从磁盘到网络的高效传输。这一机制是 Kafka 高吞吐量的关键,特别在消费者读取大批量消息时效果显著。本文从传统 I/O 的不足入手,剖析了零拷贝的实现方式(如 mmap
和 sendfile
),并通过 Java 实践验证了其性能优势。
相关文章:
深入剖析 Kafka 的零拷贝原理:从操作系统到 Java 实践
Kafka 作为一款高性能的分布式消息系统,其卓越的吞吐量和低延迟特性得益于多种优化技术,其中“零拷贝”(Zero-Copy)是核心之一。零拷贝通过减少用户态与内核态之间的数据拷贝,提升了 Kafka 在消息传输中的效率。本文将…...
深度学习:AI 大模型时代的智能引擎
当 Deepspeek 以逼真到难辨真假的语音合成和视频生成技术横空出世,瞬间引发了全球对 AI 伦理与技术边界的激烈讨论。从伪造名人演讲、制造虚假新闻,到影视行业的特效革新,这项技术以惊人的速度渗透进大众视野。但在 Deepspeek 强大功能的背后…...
【Flask开发】嘿马文学web完整flask项目第4篇:4.分类,4.分类【附代码文档】
教程总体简介:2. 目标 1.1产品与开发 1.2环境配置 1.3 运行方式 1.4目录说明 1.5数据库设计 2.用户认证 Json Web Token(JWT) 3.书架 4.1分类列表 5.搜索 5.3搜索-精准&高匹配&推荐 6.小说 6.4推荐-同类热门推荐 7.浏览记录 8.1配置-阅读偏好 8.配置 9.1项目…...
【MySQL】002.MySQL数据库基础
文章目录 数据库基础1.1 什么是数据库1.2 基本使用创建数据库创建数据表表中插入数据查询表中的数据 1.3 主流数据库1.4 服务器,数据库,表关系1.5 MySQL架构1.6 SQL分类1.7 存储引擎1.7.1 存储引擎1.7.2 查看存储引擎1.7.3 存储引擎对比 前言:…...
Python爬取视频的架构方案,Python视频爬取入门教程
文章目录 前言方案概述架构设计详细实现步骤1.环境准备2. 网页请求模块3. 网页解析模块4. 视频下载模块5. 异常处理与日志模块 代码示例:性能优化注意事项 前言 以下是一个全面的使用 Python 爬取视频的架构方案,包含方案概述、架构设计、详细实现步骤、…...
ERC-20 代币标准
文章目录 一、什么是 ERC-20?核心价值:互操作性简化开发生态基石 二、ERC-20 的六大核心功能基础功能授权与代理转账事件通知 三、ERC-20 代币的典型应用场景四、ERC-20 的技术优势与局限性优势:局限性: 五、ERC-20 代币的创建步骤…...
SpringBoot实战1
SpringBoot实战1 一、开发环境,环境搭建-----创建项目 通过传统的Maven工程进行创建SpringBoot项目 (1)导入SpringBoot项目开发所需要的依赖 一个父依赖:(工件ID为:spring-boot-starter-parent…...
GSO-YOLO:基于全局稳定性优化的建筑工地目标检测算法解析
论文地址:https://arxiv.org/pdf/2407.00906 1. 论文概述 《GSO-YOLO: Global Stability Optimization YOLO for Construction Site Detection》提出了一种针对建筑工地复杂场景优化的目标检测模型。通过融合全局优化模块(GOM)、稳定捕捉模块(SCM)和创新的AIoU损失函…...
解读json.loads函数参数
json.loads()函数是解码JSON字符串为Python对象的核心工具。本文将深入探讨json.loads()函数的各个参数。 一、基本功能与输入类型 1. 功能概述 json.loads(s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=N…...
2025.04.10-拼多多春招笔试第一题
📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 01. 神奇公园的福娃占卜 问题描述 LYA在一个神奇的公园里发现了一条特殊的小径,小径上排列着一群可爱的福娃玩偶。这条小径有 n n...
【学习笔记】CPU 的“超线程”是什么?
1. 什么是超线程? 超线程(Hyper-Threading)是Intel的技术,让一个物理CPU核心模拟出两个逻辑核心。 效果:4核CPU在系统中显示为8线程。 本质:通过复用空闲的硬件单元(如ALU、FPU)&a…...
Docker Harbor
下载Harbor安装包 wget https://github.com/goharbor/harbor/releases/download/v2.5.0/harbor-offline-installer-v2.5.0.tgz 解压安装包 tar xvf harbor-offline-installer-v2.5.0.tgz cd harbor 配置harbor vi harbor.yml hostname: registry.example.com # Harbor …...
天梯集训笔记整理
1.着色问题 直接标注哪些行和列是被标注过的,安全格子的数量就是未标注的行*列 #include <bits/stdc.h> using namespace std;const int N 1e510; int hang[N],lie[N];int main(){int n,m;cin>>n>>m;int q;cin>>q;while(q--){int x,y;ci…...
C语言复习笔记--指针(4)
在经过前几篇的复习后我们已经了解了大部分指针的类型,今天让我们继续复习指针的其他内容吧. 函数指针变量 函数指针变量的创建 什么是函数指针变量呢?函数指针变量应该是⽤来存放函数地址的,未来通过地址能够调⽤函数的。 那么函数是否有地址呢&#x…...
008二分答案+贪心判断——算法备赛
二分答案贪心判断 有些问题,从已知信息推出答案,细节太多,过程繁杂,不易解答。 从猜答案出发,贪心地判断该答案是否合法是个不错的思路,这要求所有可能的答案是单调的(例:x满足条件…...
Netty之内存池的原理和实战
深入理解Netty的内存池机制及其应用实践 在高性能网络编程中,内存管理对于系统的稳定性和性能至关重要。Netty作为一个高效的网络通信框架,通过引入内存池机制有效地解决了内存分配和回收频繁带来的性能瓶颈和内存碎片问题。本文将深入探讨Netty内存池的…...
Elasticsearch 向量数据库,原生支持 Google Cloud Vertex AI 平台
作者:来自 Elastic Valerio Arvizzigno Elasticsearch 将作为第一个第三方原生语义对齐引擎,支持 Google Cloud 的 Vertex AI 平台和 Google 的 Gemini 模型。这使得联合用户能够基于企业数据构建完全可定制的生成式 AI 体验,并借助 Elastics…...
《算法笔记》3.1小节——入门模拟->简单模拟
1001 害死人不偿命的(3n1)猜想 #include <iostream> using namespace std;int main() {int n,count0;cin>>n;while(n!1){if(n%20) n/2;else n(3*n1)/2;count1;}std::cout <<count;return 0; }1032 挖掘机技术哪家强 #include <iostream> using namespa…...
每日一题(小白)暴力娱乐篇24
由题已知这是一个匹配题目,题目已经说了三阶幻方是给定的,经过镜像和旋转,镜像*2旋转*4; 总共八种方案,然后接收每次的数据去匹配(跳过0),如果匹配就输出匹配的数组,如果…...
C++:函数模板类模板
程序员Amin 🙈作者简介:练习时长两年半,全栈up主 🙉个人主页:程序员Amin 🙊 P S : 点赞是免费的,却可以让写博客的作者开心好久好久😎 📚系列专栏:Java全…...
第18章:基于Global Context Vision Transformers(GCTx_unet)网络实现的oct图像中的黄斑水肿和裂孔分割
1. 网络概述 GCTx-UNET是基于传统UNet架构的改进版本,主要引入了以下几个关键创新: GCT模块:全局上下文变换器(Global Context Transformer)模块 多尺度特征融合:增强的特征提取能力 改进的跳跃连接:优化编码器与解…...
深入理解 Spring 的 MethodParameter 类
MethodParameter 是 Spring 框架中一个非常重要的类,它封装了方法参数(或返回类型)的元数据信息。这个类在 Spring MVC、AOP、数据绑定等多个模块中都有广泛应用。 核心功能 MethodParameter 主要提供以下功能: 获取参数类型信息…...
Docker部署HivisionIDPhotos1分钟生成标准尺寸证件照实操指南
文章目录 前言1. 安装Docker2. 本地部署HivisionIDPhotos3. 简单使用介绍4. 公网远程访问制作照片4.1 内网穿透工具安装4.2 创建远程连接公网地址 5. 配置固定公网地址 前言 相信大部分人办驾照、护照或者工作证时都得跑去照相馆,不仅费时还担心个人信息泄露。好消…...
python多线程+异步编程让你的程序运行更快
多线程简介 多线程是Python中实现并发编程的重要方式之一,它允许程序在同一时间内执行多个任务。在某些环境中使用多线程可以加快我们代码的执行速度,例如我们通过爬虫获得了一个图片的url数组,但是如果我们一个一个存储很明显会非常缓慢&…...
HDCP(五)
HDCP 2.2 测试用例设计详解 基于HDCP 2.2 CTS v1.1规范及协议核心机制,以下从正常流程与异常场景两大方向拆解测试用例设计要点,覆盖认证、密钥管理、拓扑验证等关键环节: 1. 正常流程测试 1.1 单设备认证 • 测试目标:验证源设…...
datagrip如何连接数据库
datagrip连接数据库的步骤 2025版本 想要链接数据库是需要一个jar包的,所以将上面进行删除之后,需要下载一个jar包 那么这个时候需要链接上传一个mysql链接的jar包 选择核心驱动类 上述操作完成之后,然后点击apply再点击ok即可 如下图说明my…...
Spring Boot 自动配置与启动原理全解析
下面分两部分系统讲解: 第一部分:Spring Boot 自动配置原理(核心是自动装配) 一、Spring Boot 的自动配置是干嘛的? 传统 Spring 开发时,你要写一堆 XML 或配置类,非常麻烦。Spring Boot 引入…...
python 基础:句子缩写
n int(input()) for _ in range(n):words input().split()result ""for word in words:result word[0].upper()print(result)知识点讲解 input()函数 用于从标准输入(通常是键盘)读取用户输入的内容。它返回的是字符串类型。例如在代码中…...
QML 中 Z 轴顺序(z 属性)
在 QML 中,z 属性用于控制元素的堆叠顺序(Z 轴顺序),决定元素在视觉上的前后层次关系。 基本概念 默认行为: 所有元素的默认 z 值为 0 同层级元素后声明的会覆盖先声明的 父元素的 z 值会影响所有子元素 核心规则…...
Redis快的原因
1、基于内存实现 Redis将所有数据存储在内存中,因此它可以非常快速地读取和写入数据,而无需像传统数据库那样将数据从磁盘读取和写入磁盘,这样也就不受I/O限制。 2、I/O多路复用 多路指的是多个socket连接;复用指的是复用一个线…...
蓝桥杯c ++笔记(含算法 贪心+动态规划+dp+进制转化+便利等)
蓝桥杯 #include <iostream> #include <vector> #include <algorithm> #include <string> using namespace std; //常使用的头文件动态规划 小蓝在黑板上连续写下从 11 到 20232023 之间所有的整数,得到了一个数字序列: S12345…...
每日算法-250410
今天分享两道 LeetCode 题目,它们都可以巧妙地利用二分查找来解决。 275. H 指数 II 问题描述 思路:二分查找 H 指数的定义是:一个科学家有 h 篇论文分别被引用了至少 h 次。 题目给定的 citations 数组是升序排列的。这为我们使用二分查找…...
swagger + Document
swagger 虽然有了api接口,对于复杂接口返回值说明,文档还是不能少。如果是一个人做的还简单一点,现在都搞前后端分离,谁知道你要取那个值呢...
线程同步与互斥(下)
线程同步与互斥(中)https://blog.csdn.net/Small_entreprene/article/details/147003513?fromshareblogdetail&sharetypeblogdetail&sharerId147003513&sharereferPC&sharesourceSmall_entreprene&sharefromfrom_link我们学习了互斥…...
MySQL 优化教程:让你的数据库飞起来
文章目录 前言一、数据库设计优化1. 合理设计表结构2. 范式化与反范式化3. 合理使用索引 二、查询优化1. 避免使用 SELECT *2. 优化 WHERE 子句3. 优化 JOIN 操作 三、服务器配置优化1. 调整内存分配2. 调整并发参数3. 优化磁盘 I/O 四、监控与分析1. 使用 EXPLAIN 分析查询语句…...
SD + Contronet,扩散模型V1.5+约束条件后续优化:保存Canny边缘图,便于视觉理解——stable diffusion项目学习笔记
目录 前言 背景与需求 代码改进方案 运行过程: 1、Run编辑 2、过程: 3、过程时间线: 4、最终效果展示: 总结与展望 前言 机器学习缺点之一:即不可解释性。最近,我在使用stable diffusion v1.5 Co…...
位掩码、哈希表、异或运算、杨辉三角、素数查找、前缀和
1、位掩码 对二进制数操作的方法,(mask1<<n),将数mask的第n位置为1,其它位置为0,即1000...2^n,当n较小时,可以用于解决类似于0/1背包的问题,要么是0,要么是1&…...
安装OpenJDK1.8 17 (macos M芯片)
安装OpenJDK 1.8 下载完后,解压,打开 环境变量的配置文件即可 vim ~/.zshrc #export JAVA_HOME/Users/xxxxx/jdk-21.jdk/Contents/Home #export JAVA_HOME/Users/xxxxx/jdk-17.jdk/Contents/Home #export JAVA_HOME/Users/xxxxx/jdk-11.jdk/Contents…...
Spring Boot 自动加载流程详解
前言 Spring Boot 是一个基于约定优于配置理念的框架,它通过自动加载机制大大简化了开发者的配置工作。本文将深入探讨 Spring Boot 的自动加载流程,并结合源码和 Mermaid 图表进行详细解析。 一、Spring Boot 自动加载的核心机制 Spring Boot 的自动加…...
2025 年“认证杯”数学中国数学建模网络挑战赛 C题 化工厂生产流程的预测和控制
流水线上也有每个位置的温度、压力、流量等诸多参数。只有参数处于正常范 围时,最终的产物才是合格的。这些参数很容易受到外部随机因素的干扰,所 以需要实时调控。但由于参数众多,测量困难,很多参数想要及时调整并不容 易&#x…...
Richardson-Lucy (RL) 反卷积算法 —— 通过不断迭代更新图像估计值
文章目录 一、RL反卷积算法(1)主要特点(2)基本原理(3)关键步骤(4)优化算法 二、项目实战(1)RL 反卷积(2)优化:RL 反卷积 …...
2025.04.10-拼多多春招笔试第四题
📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 04. 优惠券最优分配问题 问题描述 LYA是一家电商平台的运营经理,负责促销活动的策划。现在平台上有 n n n...
------------------V2024-2信息收集完结------------------
第二部分信息收集完结撒花*★,*:.☆( ̄▽ ̄)/$:*.★* 。 进入开发部分,工具要求:phpstorm Adobe Navicat16 小皮 准备完毕 php开发起飞起飞~~~~~...
Java Lambda与方法引用:函数式编程的颠覆性实践
在Java 8引入Lambda表达式和方法引用后,函数式编程范式彻底改变了Java开发者的编码习惯。本文将通过实战案例和深度性能分析,揭示如何在新项目中优雅运用这些特性,同时提供传统代码与函数式代码的对比优化方案。 文章目录 一、Lambda表达式&a…...
2025年常见渗透测试面试题- PHP考察(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 PHP考察 php的LFI,本地包含漏洞原理是什么?写一段带有漏洞的代码。手工的话如何发掘&am…...
【在校课堂笔记】南山 - 第 10 节课 总结
- 第 92 篇 - Date: 2025 - 04 - 10 Author: 郑龙浩/仟墨 【Python 在校课堂笔记】 南山 - 第 10 节课 文章目录 南山 - 第 10 节课一 in –> 存在性测试 - 基础介绍二 in –> 例题 - 火车票 - 使用 in 优化**问题**【代码 - 以前的代码】【代码 - 使用存在性测试 in】 …...
GaussDB ECPG与Oracle Pro_C深度对比:嵌入式SQL开发者的迁移指南
GaussDB ECPG与Oracle Pro*C深度对比:嵌入式SQL开发者的迁移指南 一、体系架构差异 关键组件对比表 二、语法兼容性分析 核心语法差异对比 c /* Pro*C示例 */ EXEC SQL SELECT empno INTO :emp_id FROM employees WHERE ename :name;/* ECPG等效实现 */ EXEC…...
debian系统中文输入法失效解决
在 Debian 9.6 上无法切换中文输入法的问题通常与输入法框架(如 Fcitx 或 IBus)的配置或依赖缺失有关。以下是详细的解决步骤: 1. 安装中文语言包 确保系统已安装中文语言支持: sudo apt update sudo apt install locales sudo…...
2025年危化品安全管理人员备考指南|智能题库+核心考点解析
作为危化品生产单位安全管理人员(主要负责人),考试内容主要涵盖三大模块: 法律法规体系 《安全生产法》修订要点(2023版) 危险化学品重大危险源辨识标准(GB 18218) 最新《化工过…...
我为女儿开发了一个游戏网站
大家好,我是星河。 自从协助妻子为女儿开发了算数射击游戏后,星河就一直有个想法:为女儿打造一个专属的学习游戏网站。之前的射击游戏虽然有趣,但缺乏难度分级,无法根据女儿的学习进度灵活调整。而且,仅仅…...