C# MemoryStream 使用详解
总目录
前言
在.NET开发中,流(Stream)是一个用于处理输入和输出的抽象类,MemoryStream
是流的一个具体实现,它允许我们在内存中读写数据,就像操作文件一样,而无需涉及磁盘 I/O 操作。尤其适合需要快速读写、转换或传输数据的场景。本文将详细讲解MemoryStream
的使用。
一、什么是 MemoryStream?
1. 定义
MemoryStream
是 System.IO
命名空间中的一个类,它允许我们在内存中创建可读写的流。与文件流或网络流不同,MemoryStream
的数据存储在内存中,它不需要依赖物理文件,因此读写速度非常快,适合处理临时数据(如网络传输、临时缓存、序列化对象等)。但会占用一定的内存资源。
📌
MemoryStream
是System.IO
命名空间中的一个类,它实现了Stream
抽象类,提供了一系列用于操作数据流的属性和方法。
2. 继承关系
2. 核心特性
- 内存高效:数据直接存储在内存中,无需磁盘 I/O,读写速度快。
- 灵活操作:支持读写、重置位置、转换为字节数组等数据处理操作。
- 轻量级:无需文件句柄,适合小到中等规模的数据。
3. 用途
- 处理大量数据,如图像、音频和视频文件等二进制数据。
- 临时存储数据,如网络传输过程中的数据缓冲。
- 实现自定义数据流逻辑,例如加密或压缩数据。
4. 为什么需要 MemoryStream?
在数据处理场景中,频繁的磁盘IO操作(如读写文件)会显著降低程序性能,尤其是面对海量数据或高频读写需求时。MemoryStream作为C#中的内存流,将数据存储在内存而非硬盘中,避免了磁盘IO瓶颈,读写速度更快。它适用于网络数据传输、临时缓存、二进制数据处理等场景,是实现高性能代码的利器!
二、基础用法
1. 创建 MemoryStream 对象
MemoryStream
有多个构造函数,可以根据需要选择合适的构造函数来初始化MemoryStream
。
1)无参构造函数
使用无参构造函数可以创建一个空白的 MemoryStream
对象,其初始容量为 0,随着数据写入自动扩展。
using System.IO;MemoryStream memoryStream = new MemoryStream();
2)带参构造函数
使用带参构造函数可以根据指定的容量创建 MemoryStream
对象,或者从一个字节数组创建。
▶ 指定初始容量的构造函数
MemoryStream memoryStream = new MemoryStream(1024);
创建一个初始容量为1024字节的MemoryStream
。
▶ 使用字节数组初始化的构造函数
byte[] buffer = new byte[] { 72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33 };
MemoryStream ms = new MemoryStream(buffer);
使用现有的字节数组初始化MemoryStream
。
2. 写入数据
MemoryStream
提供了多种方法来写入数据,最常用的是 Write
方法和 WriteByte
方法。
1)写入字节数组
使用 Write
方法可以将一个字节数组写入 MemoryStream
。
byte[] data = new byte[] { 72, 101, 108, 108, 111 };
memoryStream.Write(data, 0, data.Length);
2)写入字符串
向 MemoryStream
写入一个字符串,需要将字符串转换为字节数组。
string text = "Hello, World!";
byte[] data = System.Text.Encoding.UTF8.GetBytes(text);
memoryStream.Write(data, 0, data.Length);
3)使用 WriteByte 方法
WriteByte
方法可以逐字节写入数据。
string text = "Hello, World!";
byte[] data = System.Text.Encoding.UTF8.GetBytes(text);
foreach (byte b in data)
{memoryStream.WriteByte(b);
}
3. 读取数据
MemoryStream
提供了多种方法来读取数据,最常用的是 Read
方法和 ReadByte
方法。
1)读取字节数组
从 MemoryStream
读取一定数量的字节到字节数组中。
byte[] buffer = new byte[11];
int bytesRead = memoryStream.Read(buffer, 0, buffer.Length);
2)读取字符串
从 MemoryStream
读取一定数量的字节,然后将其转换为字符串。
byte[] buffer = new byte[11];
int bytesRead = memoryStream.Read(buffer, 0, buffer.Length);
string text = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead);
3)使用 ReadByte 方法
ReadByte
方法可以逐字节读取数据。
List<byte> byteList = new List<byte>();
while (memoryStream.Position < memoryStream.Length)
{byteList.Add((byte)memoryStream.ReadByte());
}
string text = System.Text.Encoding.UTF8.GetString(byteList.ToArray());
4. 常用属性
1)Capacity
获取或设置分配给MemoryStream
的字节数
MemoryStream memoryStream = new MemoryStream(1024);
int capacity = memoryStream.Capacity; // 输出:1024
2)Length
获取MemoryStream
中实际使用的数据长度。
MemoryStream memoryStream = new MemoryStream(1024);
long length = memoryStream.Length; // length = 0
3)Position
获取或设置MemoryStream
的当前读写位置。
memoryStream.Position = 0; // 定位到流的开头
4)CanRead、CanWrite、CanSeek
bool canRead = ms.CanRead;
bool canWrite = ms.CanWrite;
bool canSeek = ms.CanSeek;
表示MemoryStream
是否支持读取、写入和定位操作。对于MemoryStream
,这些属性通常返回true
。
5. 常用辅助方法
1)SetLength 设置长度
使用 SetLength
方法可以设置 MemoryStream
的长度,如果新长度小于当前长度,数据将被截断;如果新长度大于当前长度,数据将被扩展。
memoryStream.SetLength(50);
2)Seek 设置当前读写位置
ms.Seek(0, SeekOrigin.Begin);
移动MemoryStream
的当前读写位置。
3)ToArray 转换为字节数组
使用 ToArray
方法可以将 MemoryStream
的内容转换为字节数组。
byte[] allBytes = memoryStream.ToArray();
4)GetBuffer 获取底层缓冲区的字节数组
byte[] buffer = memoryStream.GetBuffer();
GetBuffer
方法返回底层缓冲区的完整字节数组(包含未使用的空间),ToArray
方法返回仅包含有效数据的数组(排除未使用的空间)。
关于 ToArray 和 GetBuffer 方法的区别,详见:C# MemoryStream 中 ToArray 和 GetBuffer 的区别
6. Position 注意事项
1)写入数据后的 Position 自动前进
// 创建空的 MemoryStream
using (MemoryStream ms = new MemoryStream())
{// 写入字符串byte[] data = System.Text.Encoding.UTF8.GetBytes("Hello, MemoryStream!");ms.Write(data, 0, data.Length);// 写入后的位置自动前进Console.WriteLine($"当前位置:{ms.Position}"); // 输出:20(假设 UTF-8 编码)
}
2)读取数据 必须重置 Position
using (MemoryStream ms = new MemoryStream())
{// 写入数据后重置位置到开头ms.Write(data, 0, data.Length);ms.Position = 0; // 必须重置位置才能读取// 读取数据byte[] buffer = new byte[ms.Length];ms.Read(buffer, 0, (int)ms.Length);string result = System.Text.Encoding.UTF8.GetString(buffer);Console.WriteLine(result); // 输出:Hello, MemoryStream!
}
Tips:
除了使用Position
属性重置位置外,读写前还可用Seek()
调整指针位置,如stream.Seek(0, SeekOrigin.Begin)
。
7. 示例代码
下面是一个完整的示例,演示了如何使用 MemoryStream
:
public class Program
{public static void Main(string[] args){// 创建 MemoryStreamMemoryStream memoryStream = new MemoryStream();// 获取当前读写的位置Console.WriteLine($"MemoryStream Position: {memoryStream.Position}");// 输出:MemoryStream Position: 0string text = "Hello, World!";byte[] data = System.Text.Encoding.UTF8.GetBytes(text);// 写入数据memoryStream.Write(data, 0, data.Length);// 转换为字节数组Console.WriteLine(BitConverter.ToString(memoryStream.ToArray())); //输出:48-65-6C-6C-6F-2C-20-57-6F-72-6C-64-21// 设置长度memoryStream.SetLength(50);// 获取长度Console.WriteLine($"MemoryStream length: {memoryStream.Length}"); // 输出:MemoryStream length: 50// 获取当前读写的位置Console.WriteLine($"MemoryStream Position: {memoryStream.Position}");// 输出:MemoryStream Position: 13// 读取数据byte[] buffer = new byte[5];int bytesRead = memoryStream.Read(buffer, 0, buffer.Length);// 输出结果Console.WriteLine(BitConverter.ToString(buffer)); // 输出:00-00-00-00-00// 定位memoryStream.Position = 0;// 再次读取数据bytesRead = memoryStream.Read(buffer, 0, buffer.Length);Console.WriteLine(BitConverter.ToString(buffer)); // 输出:48 65 6C 6C 6FConsole.WriteLine(Encoding.UTF8.GetString(buffer)); //输出:Hello// 清空 MemoryStreammemoryStream.SetLength(0);memoryStream.Position = 0;// 检查是否清空Console.WriteLine("MemoryStream length after clear: " + memoryStream.Length); // 输出:MemoryStream length after clear: 0}
}
通过这个示例,我们可以看到 MemoryStream
在处理内存中的数据流时是多么灵活和有用。它不仅可以用于临时存储数据,还可以用于实现复杂的数据处理逻辑。
三、MemoryStream的高级使用
1. 数据交互
1)与文本数据交互
使用 StreamReader
/StreamWriter
public class Program
{public static void Main(string[] args){using (MemoryStream ms = new MemoryStream()){// 创建一个StreamWriter,用于向MemoryStream写入字符串using (StreamWriter sw = new StreamWriter(ms, Encoding.UTF8, 1024, leaveOpen: true)){// leaveOpen: true 的作用:// 防止 StreamWriter 关闭时连带关闭底层的 MemoryStream,确保后续 StreamReader 可正常操作流sw.WriteLine("Hello, World!");sw.WriteLine("This is a test.");}// 将MemoryStream的位置重置到开头ms.Seek(0, SeekOrigin.Begin);// 创建一个StreamReader,用于从MemoryStream读取字符串using (StreamReader sr = new StreamReader(ms, Encoding.UTF8)){string line;while ((line = sr.ReadLine()) != null){Console.WriteLine(line);}}}}
}
在这个例子中,我们首先创建了一个MemoryStream
实例,然后使用StreamWriter
向MemoryStream
写入了两行字符串。写入完成后,我们将MemoryStream
的位置重置到开头,接着使用StreamReader
从MemoryStream
读取字符串并打印到控制台。
2)与二进制数据交互
使用 BinaryReader
/BinaryWriter
public class Program
{public static void Main(string[] args){using (MemoryStream ms = new MemoryStream()){// 创建一个BinaryWriter,用于向MemoryStream写入二进制数据using (BinaryWriter writer = new BinaryWriter(ms,Encoding.UTF8,leaveOpen:true)){// leaveOpen: true 的作用:// 防止 StreamWriter 关闭时连带关闭底层的 MemoryStream,确保后续 StreamReader 可正常操作流writer.Write(32);// 写入整数writer.Write(12.3f);// 写入单精度浮点数writer.Write("This is a test.");// 写入字符串}// 将MemoryStream的位置重置到开头ms.Seek(0, SeekOrigin.Begin);// 创建一个 BinaryReader,用于从MemoryStream读取二进制数据using (BinaryReader reader = new BinaryReader(ms, Encoding.UTF8)){Console.WriteLine(reader.ReadInt32()); //输出:32Console.WriteLine(reader.ReadSingle()); //输出:12.3Console.WriteLine(reader.ReadString()); //输出:This is a test.}}}
}
3)与网络流交互
将内存流作为网络传输的缓冲区:
// 服务端接收数据
NetworkStream ns = client.GetStream();
MemoryStream ms = new MemoryStream();
ns.CopyTo(ms); // 将网络流复制到内存流
byte[] buffer = ms.ToArray();
2. 高级技巧
1)及时释放资源
使用using
语句:确保流对象及时释放,避免内存泄漏。
using (MemoryStream stream = new MemoryStream()) { /*...*/ }
2)设置初始容量
预分配容量:若已知数据大小,初始化时指定Capacity
减少动态扩容开销。
频繁写入数据时,指定初始容量可避免内存频繁扩容:
// 预分配 1MB 内存
using (MemoryStream ms = new MemoryStream(1024 * 1024))
{// 写入大量数据
}
3)重置流以复用内存
通过 SetLength(0)
和 Seek
方法或 设置Position
重置流:
using (MemoryStream ms = new MemoryStream())
{ms.Write(data, 0, data.Length);// 重置流并清空内容ms.SetLength(0); ms.Position = 0; //或 ms.Seek(0, SeekOrigin.Begin);// 重新写入新数据ms.Write(newData, 0, newData.Length);
}
3. 实际应用示例
1)使用MemoryStream序列化和反序列化对象
using System;
using System.Text;
using System.Text.Json;public class Person
{public string Name { get; set; }public int Age { get; set; }
}class Program
{static void Main(){Person person = new Person { Name = "John Doe", Age = 30 };// 序列化对象到MemoryStreamusing (MemoryStream ms = new MemoryStream()){JsonSerializer.Serialize(ms, person);// 将MemoryStream的位置重置到开头ms.Seek(0, SeekOrigin.Begin);// 反序列化对象从MemoryStreamPerson deserializedPerson = JsonSerializer.Deserialize<Person>(ms);Console.WriteLine("Name: " + deserializedPerson.Name); // 输出:Name: John DoeConsole.WriteLine("Age: " + deserializedPerson.Age); // 输出:Age: 30}}
}
2)使用MemoryStream作为临时缓冲区
using System;
using System.IO;
public class MemoryStreamExample
{public static void Main(){// 创建一个MemoryStream作为临时缓冲区using (MemoryStream ms = new MemoryStream()){// 写入一些数据到MemoryStreambyte[] data = new byte[] { 1, 2, 3, 4, 5 };ms.Write(data, 0, data.Length);// 将MemoryStream作为参数传递给其他方法ProcessData(ms);}}public static void ProcessData(MemoryStream ms){// 将MemoryStream的位置重置到开头ms.Seek(0, SeekOrigin.Begin);// 读取数据 from MemoryStreambyte[] buffer = new byte[ms.Length];ms.Read(buffer, 0, buffer.Length);Console.WriteLine("Received data:");foreach (byte b in buffer){Console.Write(b + " ");}}
}
3)高效处理复杂场景
案例:日志文件关键字筛选
假设需要从多个.log
文件中提取含特定关键字的行,传统方法可能导致内存暴涨。
优化方案:
- 逐行读取文件:使用
StreamReader
避免一次性加载大文件。 - 内存流缓存匹配行:将匹配的行暂存至
MemoryStream
,减少磁盘IO次数。 - 批量写入结果:最后将内存流数据一次性写入目标文件。
实测性能提升显著List<string> matchedLines = new List<string>(); foreach (var file in Directory.GetFiles("logs", "*.log")) {using (var reader = new StreamReader(file)) {while (!reader.EndOfStream) {string line = reader.ReadLine();if (Regex.IsMatch(line, "keyword")) {matchedLines.Add(line);}}} } // 使用MemoryStream合并数据并写入文件 using (MemoryStream ms = new MemoryStream()) {byte[] buffer = Encoding.UTF8.GetBytes(string.Join("\n", matchedLines));ms.Write(buffer, 0, buffer.Length);File.WriteAllBytes("result.txt", ms.ToArray()); }
四、常见问题与解决方案
1. 读取时超出容量
// 错误示例:未重置位置导致读取失败
using (MemoryStream ms = new MemoryStream())
{ms.Write(data, 0, data.Length);byte[] buffer = new byte[ms.Length];ms.Read(buffer, 0, buffer.Length); // 抛出异常,因为 Position 已在末尾
}// 正确做法:重置位置
ms.Position = 0;
ms.Read(buffer, 0, buffer.Length);
2. 处理大文件时的内存问题
当数据量超过内存限制时,改用 FileStream
:
// 替代方案:使用文件流
using (FileStream fs = new FileStream("temp.bin", FileMode.Create))
{// 写入数据到文件流
}
3. 异步操作
通过 ToArray()
获取字节数组后,可异步处理:
public async Task ProcessAsync()
{using (MemoryStream ms = new MemoryStream()){// 写入数据byte[] data = ms.ToArray();// 异步发送到网络await client.SendAsync(data);}
}
五、MemoryStream的优缺点
优点
- 内存中操作速度快:由于数据存储在内存中,读写速度非常快。
- 容量灵活:
MemoryStream
的容量可以动态增长,以适应数据量的变化。 - 支持读写定位操作:支持
CanRead
、CanWrite
和CanSeek
属性,便于灵活操作。
缺点
- 内存占用高:处理大量数据时,可能会占用大量的内存资源。
- 不适合持久化存储:数据存储在内存中,程序关闭后数据会丢失。
六、最佳实践总结
-
资源管理
始终使用using
语句确保流正确释放:using (MemoryStream ms = new MemoryStream()) { ... }
-
位置重置
写入后读取前必须重置Position
到0
。 -
性能优化
- 指定初始容量:在创建
MemoryStream
时,尽量指定初始容量,以减少动态增长的次数,提高性能。 - 处理大量数据时谨慎使用:处理大量数据时,考虑使用文件流或其他适合的流类型,避免内存占用过高。(对大文件使用
FileStream
替代。)
- 指定初始容量:在创建
结语
回到目录页:C#/.NET 知识汇总
希望以上内容可以帮助到大家,如文中有不对之处,还请批评指正。
参考资料:
C# MemoryStream流的详解与示例
C# Stream 和 byte[] 之间的转换(文件流的应用)
C# Stream篇(五) – MemoryStream
相关文章:
C# MemoryStream 使用详解
总目录 前言 在.NET开发中,流(Stream)是一个用于处理输入和输出的抽象类,MemoryStream是流的一个具体实现,它允许我们在内存中读写数据,就像操作文件一样,而无需涉及磁盘 I/O 操作。尤其适合需…...
(二)万字长文解析:deepResearch如何用更长的思考时间换取更高质量的回复?各家产品对比深度详解
DeepResearch的研究背景 业务背景:用更长的等待时间,换取更高质量、更具实用性的结果 当前AI技术发展正经历从“即时响应”到“深度思考”的范式转变。用户对延迟的容忍度显著提升,从传统200ms的交互响应放宽至数秒甚至数分钟,以…...
Redis场景问题1:缓存穿透
Redis 缓存穿透是指在缓存系统(如 Redis)中,当客户端请求的数据既不在缓存中,也不在数据库中时,每次请求都会直接穿透缓存访问数据库,从而给数据库带来巨大压力,甚至可能导致数据库崩溃。下面为…...
数据结构(并查集,图)
并查集 练习版 class UnionFindSet { public:void swap(int* a, int* b){int tmp *a;*a *b;*b tmp;}UnionFindSet(size_t size):_ufs(size,-1){}int UnionFind(int x){}void Union(int x1, int x2){}//长分支改为相同节点int FindRoot(int x){}bool InSet(int x1, int x2)…...
深度学习篇---断点重训模型部署文件
文章目录 前言一、断点重训(Checkpoint)文件1. 动态图(DyGraph)模式.pdparams 文件.pdopt 文件.pdscaler 文件.pdmeta 或 .pkl 文件 2. 静态图(Static Graph)模式.pdparams 和 .pdopt 文件.ckpt 文件 3. 恢…...
chromem-go + ollama + bge-m3 进行文档向量嵌入和查询
Ollama 安装 https://ollama.com/download Ollama 运行嵌入模型 bge-m3:latest ollama run bge-m3:latestchromem-go 文档嵌入和查询 package mainimport ("context""fmt""runtime""github.com/philippgille/chromem-go" )func ma…...
运维面试题(十一)
1.如果一个硬盘 IO 时阻塞了,会发生什么情况? 进程/线程挂起:发起I/O操作的进程或线程会被操作系统置为阻塞状态(等待状态),直到I/O完成。CPU资源释放:阻塞的线程会让出CPU,操作系统…...
深度学习中常见的专业术语汇总
本硕博都是搞机械的匠人,当然也想做一下交叉学科的东西,蹭一下人工智能的热点。虽然世界是个草台班子,但是来都来了,咱也要把这场戏演好。 记得之前网上爆料有位大学生发了很多水文,对,是交叉学科的&#x…...
人工智能赋能医疗:开启智慧医疗新时代
在当今数字化浪潮的推动下,人工智能(AI)技术正以前所未有的速度渗透到各个行业,其中医疗领域更是成为AI技术大放异彩的重要舞台。从疾病诊断到治疗方案制定,从医疗影像分析到药物研发,AI正在为传统医疗带来…...
stable diffusion 本地部署教程 2025最新版
前提: 需要环境 git git下载地址Git - Downloading Package 直接装即可 python3.10.6 下载地址 Python Release Python 3.10.6 | Python.org 记得python环境一定要3.10.6!!! 第一个版本 项目地址https://github.…...
[Mac]利用Hexo+Github Pages搭建个人博客
由于我这台Mac基本没啥环境,因此需要从零开始配置,供各位参考。 注意⚠️:MacBook (M4)使用/bin/zsh作为默认Shell,其对应的配置文件为~/.zshrc 参考文档: HEXO系列教程 | 使用GitHub部署静态博客HEXO | 小白向教程 文…...
罗杰斯特回归
定义 逻辑回归其实就是原来的线性回归加了激活函数,这个函数其实就是sigmoid函数,把一个回归的连续数值压缩到了0到1的空间,其实只要有函数能够满足把数值压缩到0,1之间就可以(因为0到1之间的数值就是概率值) 对于分类…...
27_promise
插入一下前端助手测试,顺手可以用来做安全 promise promise 是一个es6新增的语法 汉语:承诺的意思 作用:是专门用来解决回调地狱!!!! 什么是回调函数? <script>// 回调函数 callback回调// 就是把函数A当作参数传递到函数B中// 在函…...
【机械视觉】C#+VisionPro联合编程———【六、visionPro连接工业相机设备】
【机械视觉】C#VisionPro联合编程———【六、visionPro连接工业相机设备】 目录 【机械视觉】C#VisionPro联合编程———【六、visionPro连接工业相机设备】 前言: 连接步骤说明 一. 硬件连接 支持的相机接口类型: 连接步骤 2. 软件配置 Visio…...
红宝书第十九讲:详解JavaScript的Fetch API与Ajax请求
红宝书第十九讲:详解JavaScript的Fetch API与Ajax请求 资料取自《JavaScript高级程序设计(第5版)》。 查看总目录:红宝书学习大纲 一、基本概念:为什么需要Fetch? Fetch API是浏览器提供的现代网络请求工…...
【深度学习新浪潮】具身智能及其发展前景分析
一、具身智能的定义 具身智能(Embodied Intelligence) 是指通过物理载体(如机器人)与环境实时交互,实现感知、决策与行动闭环的智能系统。其核心在于将人工智能与物理实体结合,强调“智能源于身体与环境的互动”,而非仅依赖虚拟算法。具身智能的典型特征包括多模态感知…...
练习题:111
目录 Python题目 题目 题目分析 需求理解 关键知识点 实现思路分析 代码实现 代码解释 指定文件路径和名称: 定义要写入的内容: 打开文件并写入内容: 异常处理: 输出提示信息: 运行思路 结束语 Python题…...
第三次作业
1、将你的虚拟机的网卡模式设置为nat模式,给虚拟机网卡配置三个主机位分别为100、200、168的ip地址 首先将虚拟机在vmware编辑里将网卡模式改为nat 然后用nmcli c mod ens160 ipv4.addresses 192.168.254.100 nmcli c mod ens160 ipv4.addresses 192.168.254.200…...
Oracle数据库数据编程SQL<3.1 PL/SQL 匿名块 及 流程控制中的条件判断、循环、异常处理和随机函数应用>
PL/SQL部分 在SQL的基础上增加了一些过程化的控制语句。 过程化控制语句包括:类型定义、判断、循环、游标、异常处理(例外处理) 目录 PL/SQL匿名块 一、匿名块基本结构 1、匿名块由三个部分组成: 2、注意事项: …...
CEF 给交互函数, 添加控制台是否显示交互参数log开关
CEF 控制台添加一函数,枚举 注册的供前端使用的CPP交互函数有哪些 CEF 多进程模式时,注入函数,获得交互信息-CSDN博客 这两篇文章,介绍了注入函数,在控制台中显示 各自提供的交互函数信息。 有些场景下,我们还需要更详细的信息,比如想知道 彼此传递的参数, 如果每次调…...
如何用 Postman 正确传递 Date 类型参数,避免服务器解析错误?
如何在 Postman 中传递 Date 类型参数。调试工具如何模拟发送用户端的当前时间呢? Postman 传递 Date 类型参数教程...
从代码学习深度学习 - 含并行连结的网络(GoogLeNet)PyTorch版
文章目录 前言一、GoogLeNet的理论基础1.1 背景与创新点1.2. Inception模块的工作原理二、完整代码实现与解析2.1. 环境准备与工具函数2.2. 数据加载 - Fashion-MNIST2.3. Inception模块设计2.4. GoogLeNet完整模型2.5. 训练函数2.6. 运行训练三、训练结果与分析3.1. 性能分析3…...
进程Kill杀死后GPU显存没有释放仍然被占用,怎么杀死僵尸进程
参考链接: https://blog.csdn.net/qq_37591986/article/details/131118109 使用下面的命令: fuser -v /dev/nvidia0 | awk {print $0} | xargs kill -9一般来说他会杀掉整个用户的所有进程。...
Deepseek API+Python 测试用例一键生成与导出 V1.0.3
** 功能详解** 随着软件测试复杂度的不断提升,测试工程师需要更高效的方法来设计高覆盖率的测试用例。Deepseek API+Python 测试用例生成工具在 V1.0.3 版本中,新增了多个功能点,优化了提示词模板,并增强了对文档和接口测试用例的支持,极大提升了测试用例设计的智能化和易…...
【字符设备驱动开发–IMX6ULL】(一)简介
【字符设备驱动开发–IMX6ULL】(一)简介 一、Linux驱动与裸机开发区别 1.裸机驱动开发回顾 1、底层,跟寄存器打交道,有些MCU提供了库。 spi.c:主机驱动(换成任何一个设备之后只需要调用此文件里面的…...
MaxKB 如何通过Nginx修改浮框提示文字
在使用MaxKB做第三方嵌入的时候,总会有想Diy前端样式的场景,下面就通过Nginx的方式,实现浮框样式的改变。 一、效果对比 修改前: 修改后: 前后对比: 修改了提示文字。去掉了图标后面的白框 下面讲一下该…...
中小型企业网络的搭建
1.1 网络逻辑拓扑、布线方案的设计 1.1.1 网络设计依据 网络设计应遵循以下基本原则: 高效性:确保网络架构能够支持企业日常业务的高效运行。 可靠性:采用冗余设计,确保网络的高可用性,避免单点故障。 可扩展性…...
第二卷:海盐城血战(37-72回)正反人物群像
第二卷:海盐城血战(37-72回)正反人物群像 核心矛盾:寒门军事崛起 → 内部倾轧 → 制度性腐败 主题:通过人物群像展现寒门胜利的虚幻性与权力异化的必然性 一、正派阵营(寒门抗争势力) 1. 刘裕…...
qt之使用redis与其他程序(python)交互同通信
一、前言 有需求,趁热调试出了嵌入式系统的算法环境安装和远程桌面以及一些其他的之前一直未调试出搁置的功能,趁热继续调试进阶功能redis通信,redis与sqlite各有千秋,redis可以作为在嵌入式系统下多个程序之间相互通信的中间件&…...
Pycharm(七):几个简单案例
一.剪刀石头布 需求:和电脑玩剪刀石头布游戏 考察点:1.随机数;2.判断语句 import random # numrandom.randint(1,3) # print(num) # print(**30) #1.录入玩家手势 playerint(input(请输入手势:(1.剪刀 2.石头 3&…...
05.AI搭建preparationの(transformers01)BertTokenizer实现分词编码
一、下载 bert-base-chinese镜像下载 二、简介作用: 模型每个参数占用的字节大小模型大小模型大小层数头数GPT-14 个字节的 FP32 精度浮点数117M446MB1212GPT-22 个字节的 FP161.5亿到1.75亿0.5GB到1.5GB4816GPT-32 个字节的 FP161.75万亿(17500亿&a…...
Perl 环境安装指南
Perl 环境安装指南 引言 Perl是一种广泛使用的解释型、动态编程语言,以其强大的文本处理能力和灵活性著称。本文将为您详细介绍Perl环境的安装过程,包括系统要求、安装步骤以及注意事项。 系统要求 在安装Perl之前,请确保您的计算机满足以下基本要求: 操作系统:Window…...
Visual Studio中创建和配置设置文件(Settings.settings) - 详细步骤指南——待调试
#在Visual Studio中创建和配置设置文件(Settings.settings) - 详细步骤指南 在Visual Studio中创建和配置应用程序设置文件,用于保存用户上次输入的值。 第一步:添加设置文件 1. **打开你的项目**:在Visual Studio中打开你的AutoCAD插件项目 …...
Nginx的时钟精度陷阱:request_time与upstream_response_time差异分析
在elasticsearch 采集nginx日志分析的场景下发现, request_time 小于upstream_response_time ,于是才有了这边文章。 在 Nginx 中,upstream_response_time 和 request_time 使用不同的系统时钟和精度机制来记录时间,这可能导致 u…...
参加李继刚线下活动启发:未来提示词还会存在吗?
上周六,我参加了李继刚老师组织的线下活动。 现场干货满满,尤其是关于 AI 时代提示词的价值、与 AI 沟通的艺术等话题,李老师的分享如同醍醐灌顶,让我对 AI 人机协作有了更深的理解。 将几点核心收获整理出来,与大家…...
C++作用域辨识详解
在 C 中,作用域(Scope)定义了变量、函数、类等标识符的可见性和生命周期。理解作用域对于编写清晰、高效的代码至关重要。以下是 C 中作用域的详细分类和说明。 1. 全局作用域(Global Scope) 全局作用域是指在所有函…...
MYTOOL-记事本
一、前言 目录 1.原型设计 2.程序实现 3.最终界面说明 二、环境 windows10 每个软件工具前期会设计大概的原型,我设计的原型工具使用Axure RP9,很不错的一个设计工具 三、正文 1.原型设计 2.程序实现 3.最终界面说明 四、结语...
混合知识表示系统框架python示例
前文我们已经深入学习了框架表示法、产生式规则和一阶谓词逻辑,并对它们进行了深度对比,发现它们在不同的应用场景下各有优缺点。 一阶谓词逻辑适合复杂逻辑推理场景,具有数学定理证明、形式化系统规范的优点;产生式规则适合动态决策系统,支持实时决策(如风控、诊断),规…...
Vue2——常用指令总结、指令修饰符、v-model原理、computed计算属性、watch监听器、ref和$refs
文章目录 一、概念理解二、指令1. 常用内置指令总结2. 常用指令修饰符3. 自定义指令4. v-model原理表单类组件封装 三、补充1. computed计算属性2. watch监视器3. ref和$refs 一、概念理解 【事件处理函数】 事件处理函数应该写到一个跟data同级的配置项(methods&a…...
2025-3-29算法打卡
一,回文判定 1.题目描述: 题目描述 给定一个长度为 nn 的字符串 SS。请你判断字符串 SS 是否回文。 输入描述 输入仅 11 行包含一个字符串 SS。 1≤∣S∣≤1061≤∣S∣≤106,保证 SS 只包含大小写、字母。 输出描述 若字符串 SS 为回…...
【网络编程】搭建一个简单的UDP通信服务器和客户端
🦄个人主页:修修修也 🎏所属专栏:网络编程 ⚙️操作环境:VS Code (操作系统:Ubuntu 22.04 server 64bit) 目录 搭建UDP服务器 搭建UDP客户端 其余工程文件 主函数文件Main.cc 日志打印文件Log.hpp Makefile文件 结语 搭建UDP服务器 搭建UDP服务器的主要流…...
数据分析概述
数据分析:用适当的分析方法和挖掘方法对收集来的数据进行研究总结,提取有用的信息,形成结论并支持决策的过程。 一.数据分析的分类 1.业务描述性分析。以数据为分析对象,以探索数据内的有用信息为主要途径,以解决业务…...
【C#】C#字符串拼接的6种方式及其性能分析对比
C#字符串拼接的6种方式及其性能分析对比 前言BenchmarkDotNet拼接基础数据操作符$内插字符串String.FormatString.ConcatString.JoinStringBuilder性能基准对比测试完整代码少量字符串拼接大量字符串拼接 前言 在C#编程中字符串拼接是一种常见且基础的操作,广泛应用…...
图解AUTOSAR_SWS_SPIHandlerDriver
AUTOSAR SPI Handler/Driver 详解 AUTOSAR标准下的SPI通信模块详细设计与实现 目录 AUTOSAR SPI Handler/Driver 详解 目录1. AUTOSAR SPI模块概述 1.1 SPI模块的作用1.2 SPI模块在AUTOSAR中的位置1.3 SPI模块整体架构 2. SPI模块状态机 2.1 状态定义2.2 状态转换2.3 子状态机…...
华为HCIE网络工程师培训选机构攻略
从 官方授权机构 到 性价比黑马,结合价格、师资、通过率等维度,为你筛选出最适合的培训方案。 一、华为官方授权机构(优先推荐) 华为官方授权机构拥有 真机实验环境考官级讲师,适合预算充足、追求高通过率的学员。 机…...
【银河麒麟系统常识】命令:dotnet --list-sdks(列出已安装的 .NET SDK 版本)
命令: dotnet --list-sdks 功能 列出当前系统中所有已安装的 .NET SDK 版本; 返回值规则 # 1. 格式:<版本号>[<安装路径>]; # 2. 排序:按版本号从低到高排序;示例...
【数据仓库】湖仓一体的核心建模理论
湖仓一体(Lakehouse)是一种融合数据湖与数据仓库优势的新型架构,其建模理论在传统数据仓库与数据湖基础上进行了扩展和创新。以下从核心建模理论、关键技术支撑及与传统架构的差异三个维度进行解析: 一、湖仓一体的核心建模理论 …...
Go 语言规范学习(3)
文章目录 Properties of types and valuesRepresentation of valuesUnderlying types【底层类型】Core types【核心类型】Type identityAssignabilityRepresentabilityMethod sets BlocksDeclarations and scopeLabel scopesBlank identifierPredeclared identifiersExported i…...
基于django优秀少儿图书推荐网(源码+lw+部署文档+讲解),源码可白嫖!
摘要 时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,图书推荐网当然不能排除在外。本次开发的优秀少儿图书推荐网是在实际应用和软件工程的开发原理之上,运用Python语言、爬虫技术…...
CS2 DEMO导入blender(慢慢更新咯)
流程:cs2-sourcefilmmaker-blender 工具:cs2tools,cs2manager,blender,blender插件sourceio,source2viewer 导入sfm 工具界面 选择这个 sourceio插件 sourceIO其中新版本导入相机路径不见了,…...