Java NIO与传统IO性能对比分析
Java NIO与传统IO性能对比分析
在Java中,I/O(输入输出)操作是开发中最常见的任务之一。传统的I/O方式基于阻塞模型,而Java NIO(New I/O)引入了非阻塞和基于通道(Channel)和缓冲区(Buffer)的新方式,能够更有效地处理大量I/O操作。本文将对Java传统I/O和NIO的性能进行对比分析,并展示如何通过代码实例理解两者的差异。
传统I/O概述
传统的Java I/O库基于流(Stream)和阻塞I/O模型。在传统I/O中,所有的操作都是同步的,当读取或写入数据时,操作会阻塞,直到数据完全读写完毕。这种方式的优点是简单直观,适合处理小规模的I/O操作。然而,在面对大量并发I/O时,传统I/O的性能表现就会显得比较差,容易导致线程阻塞,造成不必要的资源浪费。
传统I/O的使用
import java.io.*;public class TraditionalIOExample {public static void main(String[] args) {try (FileInputStream fis = new FileInputStream("input.txt");FileOutputStream fos = new FileOutputStream("output.txt")) {byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = fis.read(buffer)) != -1) {fos.write(buffer, 0, bytesRead);}} catch (IOException e) {e.printStackTrace();}}
}
在这个示例中,我们通过传统的FileInputStream
和FileOutputStream
读取和写入文件。fis.read(buffer)
方法是阻塞的,直到读取完数据才会返回。
Java NIO概述
Java NIO(New I/O)是Java 1.4引入的一种新的I/O库,提供了对I/O的改进,尤其是针对高性能I/O和大规模并发I/O操作。NIO引入了通道(Channel)和缓冲区(Buffer)模型,并支持非阻塞I/O(Non-blocking I/O)和选择器(Selector)机制,从而能够显著提高I/O性能。
NIO的使用
import java.nio.*;
import java.nio.channels.*;
import java.io.*;
import java.nio.file.*;public class NIOExample {public static void main(String[] args) {Path inputPath = Paths.get("input.txt");Path outputPath = Paths.get("output.txt");try (FileChannel inputChannel = FileChannel.open(inputPath, StandardOpenOption.READ);FileChannel outputChannel = FileChannel.open(outputPath, StandardOpenOption.WRITE, StandardOpenOption.CREATE)) {ByteBuffer buffer = ByteBuffer.allocate(1024);while (inputChannel.read(buffer) != -1) {buffer.flip();outputChannel.write(buffer);buffer.clear();}} catch (IOException e) {e.printStackTrace();}}
}
在这个NIO示例中,我们使用FileChannel
与ByteBuffer
来实现文件的读写操作。与传统I/O不同,NIO使用FileChannel
通过缓冲区读取数据,并且可以通过非阻塞的方式进行操作。数据通过ByteBuffer
的flip()
和clear()
方法进行管理。
传统I/O与NIO的性能对比
1. 阻塞与非阻塞模型
- 传统I/O:每次I/O操作都是阻塞的,线程会等待操作完成后再继续执行。对于大量I/O请求,系统需要为每个请求分配线程,可能导致线程上下文切换和线程池资源消耗过大。
- NIO:NIO通过非阻塞I/O模型允许线程在等待数据时进行其他任务处理,减少了线程的阻塞,提高了系统的吞吐量。
2. 内存管理与效率
- 传统I/O:使用流时,数据是逐个字节地读取和写入。每次I/O操作都需要系统进行缓冲和内存分配,因此对于大量数据的读写,传统I/O的性能较差。
- NIO:NIO使用
ByteBuffer
进行缓冲区管理,它能够一次性将大量数据加载到内存中,提高了数据的读写效率。并且,NIO的缓冲区可以直接操作内存中的数据,减少了内存复制的开销。
3. 文件处理性能对比
为了对比传统I/O与NIO的性能,下面是一个简单的文件复制性能测试代码,使用两种方式分别读取和写入一个100MB的文件。
传统I/O性能测试
public class TraditionalIOPerformanceTest {public static void main(String[] args) {long startTime = System.nanoTime();try (FileInputStream fis = new FileInputStream("input.txt");FileOutputStream fos = new FileOutputStream("output.txt")) {byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = fis.read(buffer)) != -1) {fos.write(buffer, 0, bytesRead);}} catch (IOException e) {e.printStackTrace();}long endTime = System.nanoTime();System.out.println("Traditional IO Time: " + (endTime - startTime) / 1_000_000 + " ms");}
}
NIO性能测试
public class NIOPerformanceTest {public static void main(String[] args) {long startTime = System.nanoTime();Path inputPath = Paths.get("input.txt");Path outputPath = Paths.get("output.txt");try (FileChannel inputChannel = FileChannel.open(inputPath, StandardOpenOption.READ);FileChannel outputChannel = FileChannel.open(outputPath, StandardOpenOption.WRITE, StandardOpenOption.CREATE)) {ByteBuffer buffer = ByteBuffer.allocate(1024);while (inputChannel.read(buffer) != -1) {buffer.flip();outputChannel.write(buffer);buffer.clear();}} catch (IOException e) {e.printStackTrace();}long endTime = System.nanoTime();System.out.println("NIO Time: " + (endTime - startTime) / 1_000_000 + " ms");}
}
4. 结果分析
在文件复制性能测试中,通常情况下,NIO会比传统I/O快得多。原因在于:
- 更少的内存复制:NIO直接操作缓冲区,避免了传统I/O中的多次内存复制。
- 非阻塞I/O:NIO支持非阻塞I/O,允许线程在等待数据时继续执行其他任务,这对于并发环境中的性能提升尤为重要。
- 高效的通道和缓冲区机制:NIO通道和缓冲区的设计优化了大数据量的处理,使得I/O操作更高效。
5. 适用场景对比
- 传统I/O:适用于简单的、对性能要求不高的I/O操作,或者单线程、少量数据处理的场景。
- NIO:适用于高并发、大数据量处理的场景,尤其是需要处理多个文件、网络连接的应用程序。NIO的非阻塞模型和选择器机制非常适合高效处理大量并发连接。
6. NIO与传统IO在网络编程中的应用
Java NIO提供了非常强大的工具来支持高效的网络编程。在传统I/O中,每当需要处理多个连接时,我们通常会为每个连接分配一个独立的线程,这会导致线程切换和上下文切换的开销,尤其在高并发的场景下,效率会显著下降。而NIO通过通道和选择器的机制,允许一个线程管理多个网络连接,从而大幅提高了并发处理能力。
传统I/O网络编程示例
在传统的阻塞I/O模型中,每个客户端连接都会创建一个独立的线程,线程会阻塞等待数据的读取和写入,这在处理大量并发连接时会遇到瓶颈。
import java.io.*;
import java.net.*;public class TraditionalIOServer {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(8080);while (true) {Socket clientSocket = serverSocket.accept();new Thread(new ClientHandler(clientSocket)).start();}}
}class ClientHandler implements Runnable {private Socket socket;public ClientHandler(Socket socket) {this.socket = socket;}@Overridepublic void run() {try (BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintWriter writer = new PrintWriter(socket.getOutputStream(), true)) {String message;while ((message = reader.readLine()) != null) {writer.println("Echo: " + message);}} catch (IOException e) {e.printStackTrace();}}
}
在这个传统I/O的网络编程示例中,服务器每接收到一个客户端连接,就会为其创建一个新的线程。这种模型适用于低并发应用,但当连接数增加时,线程数量也会剧增,导致性能下降。
NIO网络编程示例
NIO通过Selector
和Channel
的组合,允许一个线程管理多个连接。以下是一个基于NIO的服务器示例,能够处理多个客户端连接,而不需要为每个连接创建独立线程。
import java.io.IOException;
import java.nio.*;
import java.nio.channels.*;
import java.net.*;public class NIOServer {public static void main(String[] args) throws IOException {ServerSocketChannel serverChannel = ServerSocketChannel.open();serverChannel.bind(new InetSocketAddress(8080));serverChannel.configureBlocking(false);Selector selector = Selector.open();serverChannel.register(selector, SelectionKey.OP_ACCEPT);while (true) {if (selector.select() > 0) {for (SelectionKey key : selector.selectedKeys()) {if (key.isAcceptable()) {SocketChannel clientChannel = serverChannel.accept();clientChannel.configureBlocking(false);clientChannel.register(selector, SelectionKey.OP_READ);} else if (key.isReadable()) {SocketChannel clientChannel = (SocketChannel) key.channel();ByteBuffer buffer = ByteBuffer.allocate(1024);int bytesRead = clientChannel.read(buffer);if (bytesRead == -1) {clientChannel.close();} else {buffer.flip();clientChannel.write(buffer);}}selector.selectedKeys().remove(key);}}}}
}
在这个NIO示例中,服务器使用Selector
来监听多个SocketChannel
的事件,而不需要为每个连接创建独立的线程。当某个连接可读时,服务器通过read()
方法处理数据并回写结果,而Selector
机制使得一个线程能够同时处理多个连接。
这种非阻塞I/O和事件驱动模型使得NIO能够在高并发场景下表现出更好的性能,避免了线程的过多创建和上下文切换。
7. 高并发场景下的性能对比
NIO的优势
NIO的优势主要体现在以下几个方面:
- 事件驱动模型:NIO通过
Selector
的事件驱动机制,让一个线程就能够管理多个连接,避免了大量线程的创建和销毁,提高了系统的可伸缩性。 - 非阻塞I/O:在NIO中,I/O操作是非阻塞的,可以使线程在等待I/O完成时,继续处理其他任务。与传统I/O的阻塞式操作相比,非阻塞I/O能够显著减少线程阻塞的时间,尤其适用于需要频繁进行I/O操作的场景。
- 内存管理:NIO通过
ByteBuffer
直接操作内存,避免了传统I/O中流的缓冲机制和内存复制的开销。通过一次性读写大量数据,NIO能提供更高效的内存利用率。
传统I/O的局限性
在高并发场景下,传统I/O的性能瓶颈主要体现在:
- 线程消耗:每个连接需要分配一个线程,随着连接数的增加,线程的开销也会显著增加,导致系统资源的浪费。
- 线程上下文切换:多个线程的上下文切换会造成CPU的额外负担,尤其是在高并发场景下,线程切换的开销可能会成为性能瓶颈。
- 阻塞操作:传统I/O的每个操作都是阻塞的,线程在等待I/O时无法执行其他任务,降低了系统的并发处理能力。
为了进一步验证NIO在高并发场景下的优势,以下是一个简单的性能测试,模拟了一个同时处理1000个并发客户端连接的情境。
性能测试示例:传统I/O与NIO并发连接
public class IOPerformanceTest {private static final int CLIENT_COUNT = 1000;public static void main(String[] args) {long startTime = System.nanoTime();// 启动传统IO测试runTraditionalIOTest();long endTime = System.nanoTime();System.out.println("Traditional IO Time: " + (endTime - startTime) / 1_000_000 + " ms");startTime = System.nanoTime();// 启动NIO测试runNIOTest();endTime = System.nanoTime();System.out.println("NIO Time: " + (endTime - startTime) / 1_000_000 + " ms");}private static void runTraditionalIOTest() {// 模拟1000个客户端连接,每个客户端通过传统I/O进行通信for (int i = 0; i < CLIENT_COUNT; i++) {new Thread(() -> {try (Socket socket = new Socket("localhost", 8080);PrintWriter out = new PrintWriter(socket.getOutputStream(), true);BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {out.println("Hello Server");String response = in.readLine();} catch (IOException e) {e.printStackTrace();}}).start();}}private static void runNIOTest() {// 模拟1000个客户端连接,每个客户端通过NIO进行通信for (int i = 0; i < CLIENT_COUNT; i++) {new Thread(() -> {try (SocketChannel clientChannel = SocketChannel.open(new InetSocketAddress("localhost", 8080))) {ByteBuffer buffer = ByteBuffer.wrap("Hello Server".getBytes());clientChannel.write(buffer);buffer.clear();clientChannel.read(buffer);} catch (IOException e) {e.printStackTrace();}}).start();}}
}
在此示例中,我们模拟了1000个客户端通过传统I/O和NIO进行连接,并测量了每种方式所需的时间。通常情况下,NIO在处理大量并发连接时会明显优于传统I/O,尤其是在客户端数量上升时,NIO的性能优势更加明显。
8. NIO的优化与扩展
尽管NIO在高并发环境中具有明显的性能优势,但在某些情况下,NIO的编程模型可能较为复杂。为此,Java生态中也提供了许多基于NIO的高级库和框架,这些工具封装了底层复杂性,使得开发者能够更容易地使用NIO进行高效的网络编程。
- Netty:一个基于NIO的高性能网络通信框架,广泛应用于分布式系统和高并发应用中。Netty通过优化I/O处理机制,提供了比Java NIO更高效、更易用的解决方案。
- AIO(Asynchronous I/O):Java 7引入的异步I/O(AIO)通过进一步简化I/O操作的编程模型,进一步提高了高并发场景下的性能和可扩展性。
通过使用这些库和框架,开发者可以更加专注于业务逻辑而不必深入到底层的I/O细节,同时还能充分发挥NIO和AIO的优势。
结语
NIO通过引入非阻塞I/O、通道和选择器等机制,极大提高
了Java在高并发场景下的性能,特别是在网络编程和大规模数据处理方面。与传统I/O相比,NIO能够在不增加大量线程的情况下,处理更多并发请求,减少资源消耗并提高响应效率。在高并发系统中,采用NIO不仅能够提高吞吐量,还能够显著提升系统的可伸缩性。
相关文章:
Java NIO与传统IO性能对比分析
Java NIO与传统IO性能对比分析 在Java中,I/O(输入输出)操作是开发中最常见的任务之一。传统的I/O方式基于阻塞模型,而Java NIO(New I/O)引入了非阻塞和基于通道(Channel)和缓冲区&a…...
基于YOLO11深度学习的果园苹果检测与计数系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】
《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...
基于SpringBoot畅购行汽车购票系统
作者简介:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容:🌟Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…...
基于 Spring Boot + 微信小程序的短文写作竞赛管理系统设计与实现(源码+文档)
大家好,今天要和大家聊的是一款基于 Spring Boot 微信小程序的“短文写作竞赛管理系统”的设计与实现。项目源码以及部署相关事宜请联系我,文末附上联系方式。 项目简介 基于 Spring Boot 微信小程序的“短文写作竞赛管理系统”设计与实现的主要使用…...
pytest运行用例的常见方式及参数
标题pytest运行用例方式及参数 用例结构目录 “”" 在最外层目录下执行所有的用例 参数说明: -s:显示用例的打印信息 -v:显示用例执行的详细信息 –alluredir:指定allure报告的路径 –clean-alluredir:清除allure报告的路径 -n:指定并发的进程数 -x:出现一条用…...
Miniconda + VSCode 的Python环境搭建
目录: 安装 VScode 安装 miniconda 在VScode 使用conda虚拟环境 运行Python程序 1.安装 vscode 编辑器 官网链接:Visual Studio Code - Code Editing. Redefined 下载得到:,双击安装。 安装成功…...
图解MySQL【日志】——Redo Log
Redo Log(重做日志) 为什么需要 Redo Log? 1. 崩溃恢复 数据库崩溃时,系统通过 Redo Log 来恢复尚未写入磁盘的数据。Redo Log 记录了所有已提交事务的操作,系统在重启后会重做这些操作,以保证数据不会丢…...
Trae AI驱动开发实战:30分钟从0到1实现Django REST天气服务
目录 一、Trae 安装 1、Trae 介绍 2、Trae 安装 二、项目构建 1、项目背景与技术选型 2、开发环境准备 三、需求分析 1、功能模块设计 2、数据库设计 四、功能实现 1、用户系统开发 2、天气服务实现 3、测试用例编写 五、Trae 体验总结 随着人工智能技术的迅猛发…...
【Linux网络编程】IP协议格式,解包步骤
目录 解析步骤 1.版本字段(大小:4比特位) 2.首部长度(大小:4比特位)(单位:4字节) 🍜细节解释: 3.服务类型(大小:8比特…...
中诺CHINO-E G076大容量录音电话产品使用注意事项
•本机需插上随机配置的电源适配器才能正常工作,切勿插入其它的适配器,以免损坏话机; •当本机出现异常时,请按“Δ/上查”键3秒,屏幕弹出确定恢复,按“设置”键恢复出厂设置; 注:…...
2025最新智能优化算法:改进型雪雁算法(Improved Snow Geese Algorithm, ISGA)求解23个经典函数测试集,MATLAB
一、改进型雪雁算法 雪雁算法(Snow Geese Algorithm,SGA)是2024年提出的一种新型元启发式算法,其灵感来源于雪雁的迁徙行为,特别是它们在迁徙过程中形成的独特“人字形”和“直线”飞行模式。该算法通过模拟雪雁的飞行…...
✨ 索引有哪些缺点以及具体有哪些索引类型
索引的定义与原理 索引是数据库中用于提高数据检索效率的数据结构。它就像是书籍的目录,通过目录可以快速定位到所需内容的页码,而在数据库中,索引可以帮助数据库系统快速找到符合查询条件的数据行,而不必对整个表进行扫描。 其…...
Promptic:Python 中的 LLM 应用开发利器
Promptic 是一个基于 Python 的轻量级库,旨在简化与大型语言模型(LLMs)的交互。它通过提供简洁的装饰器 API 和强大的功能,帮助开发者高效地构建 LLM 应用程序。Promptic 的设计理念是提供 90% 的 LLM 应用开发所需功能,同时保持代码的简洁和易用性。 1. Promptic 的核心…...
本地部署DeepSeek R1大模型
一、安装软件 1.1 安装Ollama 你可以访问Ollama的官方网站https://ollama.com/download,选择适合你操作系统的安装包进行下载。老周这里是Mac系统,所以选择下载macOS系统。 1.2 安装cherry studio 前往官网https://cherry-ai.com/download下载对应操…...
搅局外卖,京东连出三张牌
明牌暗牌,都不如民牌。 作者|古廿 编辑|杨舟 “京东来整顿外卖了”,这一网络热梗正在成为外界对京东近期一系列动作的高度概括。 0佣金、五险一金、品质外卖,京东连出三张牌打破外卖市场的旧秩序。此前这三项分别对应着长期被社会所诟病的…...
【ELK】【Elasticsearch】数据查询方式
1. 简单查询(URI Search) 通过 URL 参数直接进行查询,适合简单的搜索场景。 示例: bash 复制 GET /index_name/_search?qfield_name:search_value 说明: index_name:索引名称。 field_name…...
基于 JavaWeb 的 Spring Boot 网上商城系统设计和实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…...
C++17中的std::scoped_lock:简化多锁管理的利器
文章目录 1. 为什么需要std::scoped_lock1.1 死锁问题1.2 异常安全性1.3 锁的管理复杂性 2. std::scoped_lock的使用方法2.1 基本语法2.2 支持多种互斥锁类型2.3 自动处理异常 3. std::scoped_lock的优势3.1 避免死锁3.2 简化代码3.3 提供异常安全保证 4. 实际应用场景4.1 数据…...
Linux内核实时机制7 - 实时改造机理 - 软中断优化下
Linux内核实时机制7 - 实时改造机理 - 软中断优化下 https://blog.csdn.net/u010971180/article/details/145722641以下分别以Linux4.19、Linux5.4、Linux5.10、Linux5.15 展开分析,深入社区实时改造机理的软中断优化过程。https://blog.csdn.net/weixin_41028621/article/det…...
计算机网络:应用层 —— 文件传送协议 FTP
文章目录 FTP 是什么?FTP 的应用FTP 的基本工作原理主动模式被动模式 总结 FTP 是什么? 将某台计算机中的文件通过网络传送到可能相很远的另一台计算机中,是一项基本的网络应用,即文件传送。 文件传送协议FTP(File T…...
[笔记.AI]如何判断模型是否通过剪枝、量化、蒸馏生成?
以下摘自与DeepSeek-R1在线联网版的对话 一、基础判断维度 技术类型核心特征验证方法剪枝模型参数减少、结构稀疏化1. 检查模型参数量是否显著小于同类标准模型1 2. 分析权重矩阵稀疏性(如非零参数占比<30%)4量化权重/激活值精度降低、推理速度提升1…...
python: SQLAlchemy (ORM) Simple example using mysql in Ubuntu 24.04
mysql sql script: create table School 表 (SchoolId char(5) NOT NULL comment主鍵primary key,學校編號,SchoolName nvarchar(500) NOT NULL DEFAULT comment 學校名稱,SchoolTelNo varchar(8) NULL DEFAULT comment電話號碼,PRIMARY KEY (SchoolId) #主…...
【前端】【nuxt】nuxt优势(MVP开发),转换SSR与SPA模式
Nuxt.js 核心优势 自动化路由系统 无需手动配置路由:在 pages/ 目录下创建 .vue 文件即可自动生成路由,支持动态路由(如 pages/user/[id].vue → /user/:id)。嵌套路由:通过 parent.vue parent/child.vue 目录结构自动…...
洛谷B3619(B3620)
B3619 10 进制转 x 进制 - 洛谷 B3620 x 进制转 10 进制 - 洛谷 代码区: #include<algorithm> #include<iostream> #include<vector> using namespace std;int main(){int n,x;cin >> n >> x;vector<char> arry;while(n){if(…...
基于springboot+vue的酒店管理系统的设计与实现
开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…...
android调用ffmpeg解析rtsp协议的视频流
文章目录 一、背景二、解析rtsp数据1、C层功能代码2、jni层的定义3、app层的调用 三、源码下载 一、背景 本demo主要介绍android调用ffmpeg中的接口解析rtsp协议的视频流(不解析音频),得到yuv数据,把yuv转bitmap在android设备上显…...
cursor使用记录
一、如何查看自己登录的是哪个账号 操作路径:Cursor -- 首选项 -- Cursor Setting (有快捷键) 二、状态修改为竖排(默认是横排) 默认如图展示,想要像vscode、idea等等在左侧竖着展示 操作路径࿱…...
Java 使用websocket
添加依赖 <!-- WebSocket 支持 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dependency>添加配置类 Configuration public class WebSocketConfig {B…...
蓝桥杯 Java B 组之背包问题、最长递增子序列(LIS)
Day 4:背包问题、最长递增子序列(LIS) 📖 一、动态规划(Dynamic Programming)简介 动态规划是一种通过将复杂问题分解成更小的子问题来解决问题的算法设计思想。它主要用于解决具有最优子结构和重叠子问题…...
在PyTorch中使用插值法来优化卷积神经网络(CNN)所需硬件资源
插值法其实就是在已知数据点之间估计未知点的值。通过已知的离散数据点,构造一个连续的曲线函数,预测数据点之间的空缺值是什么并且自动填补上去。 适用场景: 在卷积神经网络(CNN)中的应用场景中,经常遇到计算资源有限,比如显存不够或者处理速度慢,需要用插值来降低计…...
seacmsv9 SQL注入漏洞(报错注入)
一、海洋CMS简介 海洋cms是为解决站长核心需求而设计的视频内容管理系统,一套程序自适应电脑、手机、平板、APP多个终端入口,无任何加密代码、安全有保障,是您最佳的建站工具。——来自seacms官网(简而言之就是专门搭建看片网站的…...
Java 中的内存泄漏问题及解决方案
在 Java 中,内存泄漏(Memory Leak)是指在程序运行过程中,某些对象已经不再使用,但由于引用仍然存在,这些对象无法被垃圾回收器回收,从而导致内存无法释放,最终可能导致系统性能下降甚…...
解决 ERROR: Failed building wheel for vllm Failed to build vllm
1. 完整报错 copying build\lib\vllm\model_executor\layers\fused_moe\configs\E256,N128,device_nameNVIDIA_H100_80GB_HBM3,dtypefp8_w8a8,block_shape[128,128].json -> build\bdist.win-amd64\wheel.\vllm\model_executor\layers\fused_moe\configs error: could not …...
从CNN到Transformer:遥感影像目标检测的未来趋势
文章目录 前言专题一、深度卷积网络知识专题二、PyTorch应用与实践(遥感图像场景分类)专题三、卷积神经网络实践与遥感影像目标检测专题四、卷积神经网络的遥感影像目标检测任务案例【FasterRCNN】专题五、Transformer与遥感影像目标检测专题六、Transfo…...
ecovadis社会企业责任认证
EcoVadis 是一家全球性的企业社会责任 (CSR) 评级机构,旨在通过评估企业在环境、劳工与人权、商业道德和可持续采购等方面的表现,帮助提升其可持续性和社会责任实践。 EcoVadis 认证的核心内容 环境 评估企业在能源消耗、碳排放、废物管理等方面的表现。…...
使用 Docker 部署 Flask 应用
使用 Docker 部署 Flask 应用 一、引言 在现代软件开发中,应用的部署和环境管理是至关重要的环节。传统的部署方式常常会遇到 “在我机器上能运行,在你机器上不行” 的问题,而 Docker 的出现很好地解决了这个痛点。Docker 是一个用于开发、部署和运行应用程序的开放平台,…...
istio介绍补充以及使用篇
istio介绍补充以及使用篇 前言 介绍istio各个组件创建istio的方式手动注入自动注入side car 使用istio做流量灰度如有需要收藏的看官,顺便也用发财的小手点点赞哈,如有错漏,也欢迎各位在评论区评论! 前言 前篇istio介绍了引入ist…...
DeepSeek 助力 Vue 开发:打造丝滑的 键盘快捷键(Keyboard Shortcuts)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter19-表单脚本
十九、表单脚本 表单脚本 JavaScript 较早的一个用途是承担一部分服务器端表单处理的责任。虽然 Web 和 JavaScript 都已经发展了很多年,但 Web 表单的变化不是很大。由于不能直接使用表单解决问题,因此开发者不得不使用JavaScript 既做表单验证…...
如何使用深度学习进行手写数字识别(MNIST)
目录 手写数字识别(MNIST)1. 导入必要的库2. 加载和预处理数据3. 构建模型4. 编译模型5. 训练模型6. 评估模型7. 可视化训练过程(可选)代码说明运行环境总结当然可以!下面是一个使用Python和Keras(TensorFlow后端)实现的简单深度学习案例——手写数字识别(MNIST数据集)…...
【UCB CS 61B SP24】Lecture 5 - Lists 3: DLLists and Arrays学习笔记
本文内容为构建双向循环链表、使用 Java 的泛型将其优化为通用类型的链表以及数组的基本语法介绍。 1. 双向链表 回顾上一节课写的代码,当执行 addLast() 与 getLast() 方法时需要遍历链表,效率不高,因此可以添加一个指向链表末尾的索引&am…...
Unity Excel导表工具转Lua文件
思路介绍 借助EPPlus读取Excel文件中的配置数据,根据指定的不同类型的数据配置规则来解析成对应的代码文本,将解析出的字符串内容写入到XXX.lua.txt文件中即可 EPPlus常用API //命名空间 using OfficeOpenXml;//Excel文件路径 var fileExcel new File…...
kafka消费能力压测:使用官方工具
背景 在之前的业务场景中,我们发现Kafka的实际消费能力远低于预期。尽管我们使用了kafka-go组件并进行了相关测试,测试情况见《kafka-go:性能测试》这篇文章。但并未能准确找出消费能力低下的原因。 我们曾怀疑这可能是由我的电脑网络带宽问题或Kafka部…...
算法题(74):Pow(x,n)
审题: 需要我们计算出x(double类型)的n次幂,并返回 思路: 方法一:递归 (1)首先我们的n分为正和负,对于负的我们需要将n转为正的进行运算后,用1.0除以运算结果…...
windwos与linux环境下Iperf3带宽测试工具的安装、使用
目录 一、前言 二、windows 2.1下载 2.2安装 2.3使用 2.3.1服务端 2.3.2客户端 2.3.3输出内容 1.客户端 2.服务端 2.4.相关命令 三、linux 3.1安装 3.2使用 1.服务端 2.客户端 3.输出内容 1.客户端 2.服务端 一、前言 在数字化浪潮下,网络性能…...
GCC编译器(含预处理/编译/汇编/链接四阶段详解)
GCC编译器(含预处理/编译/汇编/链接四阶段详解) 1. 预处理阶段(生成 .i 文件)2. 编译阶段(生成 .s 文件)3. 汇编阶段(生成 .o 文件)4. 链接阶段(生成可执行文件ÿ…...
20250221 NLP
1.向量和嵌入 https://zhuanlan.zhihu.com/p/634237861 encoder的输入就是向量,提前嵌入为向量 二.多模态文本嵌入向量过程 1.文本预处理 文本tokenizer之前需要预处理吗? 是的,文本tokenizer之前通常需要对文本进行预处理。预处理步骤可…...
Mac M3/M4 本地部署Deepseek并集成vscode
Mac 部署 使用傻瓜集成平台ollama,ollama平台依赖于docker,Mac的M3/M4 因doesn’t have VT-X/AMD-v enabled 所以VB,VM无法使用,导致docker无法启动,需要使用docker的替代品podman, 它完全兼容docker brew install p…...
flink使用demo
1、添加不同数据源 package com.baidu.keyue.deepsight.memory.test;import com.baidu.keyue.deepsight.memory.WordCount; import com.baidu.keyue.deepsight.memory.WordCountData; import org.apache.flink.api.common.RuntimeExecutionMode; import org.apache.flink.api.…...
目标检测中单阶段检测模型与双阶段检测模型详细对比与说明
《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...