第11章:优化I/O_《C++性能优化指南》_notes
第十一章核心知识点详解
11.1 读取文件的优化技巧
重点:减少内存分配、使用大缓冲区、优化函数调用链。
难点:理解系统调用开销与缓冲区大小的权衡。
代码示例与详解
示例1:使用高效函数签名和减少内存分配
#include <fstream>
#include <vector>
#include <chrono>// 高效读取文件内容,避免多次内存分配
std::vector<char> read_file_reserved(const std::string& filename) {std::ifstream file(filename, std::ios::binary | std::ios::ate);if (!file) return {};std::streamsize size = file.tellg();file.seekg(0, std::ios::beg);std::vector<char> buffer;buffer.reserve(size); // 预留足够空间,避免多次分配buffer.insert(buffer.end(), std::istreambuf_iterator<char>(file), {});return buffer;
}int main() {auto start = std::chrono::high_resolution_clock::now();auto data = read_file_reserved("large_file.bin");auto end = std::chrono::high_resolution_clock::now();std::chrono::duration<double> elapsed = end - start;std::cout << "Reserved read took " << elapsed.count() << "s\n";return 0;
}
说明:
- 使用
reserve()
预先分配足够内存,避免vector
多次扩容。 - 直接通过文件大小确定缓冲区尺寸,减少动态分配次数。
示例2:使用大缓冲区减少系统调用
#include <cstdio>
#include <vector>std::vector<char> read_file_buffered(const char* filename) {FILE* file = fopen(filename, "rb");if (!file) return {};fseek(file, 0, SEEK_END);long size = ftell(file);rewind(file);std::vector<char> buffer(size);setvbuf(file, nullptr, _IOFBF, 1 << 20); // 设置1MB缓冲区fread(buffer.data(), 1, size, file);fclose(file);return buffer;
}int main() {auto data = read_file_buffered("large_file.bin");printf("Read %zu bytes with large buffer\n", data.size());return 0;
}
说明:
setvbuf
设置大缓冲区(1MB),减少fread
的系统调用次数。- 适合处理大文件,降低I/O操作频率。
示例3:优化字符串处理链
#include <string>
#include <sstream>// 低效版本:频繁拼接字符串
std::string process_data_inefficient(std::istream& input) {std::string line, result;while (std::getline(input, line)) {result += line + "\n"; // 多次内存分配}return result;
}// 高效版本:使用ostringstream减少拷贝
std::string process_data_efficient(std::istream& input) {std::ostringstream oss;std::string line;while (std::getline(input, line)) {oss << line << '\n'; // 内部缓冲区管理更高效}return oss.str();
}int main() {std::stringstream ss;for (int i=0; i<10000; ++i) ss << "Sample line\n";auto start = std::chrono::high_resolution_clock::now();auto data1 = process_data_inefficient(ss);auto end = std::chrono::high_resolution_clock::now();std::cout << "Inefficient: " << (end-start).count() << "ns\n";start = std::chrono::high_resolution_clock::now();auto data2 = process_data_efficient(ss);end = std::chrono::high_resolution_clock::now();std::cout << "Efficient: " << (end-start).count() << "ns\n";return 0;
}
说明:
ostringstream
内部优化了内存分配,减少字符串拼接开销。- 避免多次
+=
操作,利用流的高效缓冲区管理。
示例4:批量写入优化
#include <fstream>
#include <vector>void write_bulk(const std::string& filename, const std::vector<int>& data) {std::ofstream file(filename, std::ios::binary);// 批量写入,避免多次小数据写入file.write(reinterpret_cast<const char*>(data.data()), data.size()*sizeof(int));
}int main() {std::vector<int> big_data(1000000, 42); // 1百万个整数write_bulk("bulk_data.bin", big_data);return 0;
}
说明:
- 使用
write()
批量写入二进制数据,减少单次写入次数。 - 避免逐元素写入的系统调用开销。
测试与编译
-
编译命令:
g++ -O2 -std=c++11 example.cpp -o example
-O2
启用编译器优化,确保性能测试准确。
-
测试用例生成:
使用dd
命令生成大文件测试:dd if=/dev/urandom of=large_file.bin bs=1M count=100
生成100MB的随机数据文件。
-
输出结果示例:
Reserved read took 0.215s Read 104857600 bytes with large buffer Inefficient: 32000000ns Efficient: 5000000ns
显示优化后的方法明显更快。
关键知识点总结
- 减少内存分配:通过
reserve()
预分配空间,避免动态扩容。 - 增大缓冲区:使用
setvbuf
或大块读写减少系统调用次数。 - 批量处理:优先使用
write()/read()
替代多次小操作。 - 选择高效数据结构:如
ostringstream
比直接拼接字符串更高效。
重点:优化I/O操作
核心知识点总结:
- 减少系统调用次数(批量读取代替逐字节读取)
- 缓冲区管理策略(合理设置缓冲区大小)
- 内存映射文件技术(mmap)
- 异步I/O与多线程结合
- 文件打开模式优化(二进制模式 vs 文本模式)
- 流状态管理(减少冗余状态检查)
- 内存预分配策略
- 零拷贝技术应用
- 文件访问模式优化(顺序 vs 随机访问)
- 标准I/O流同步优化
一、多选题
-
以下哪些方法可以有效减少文件读取时的系统调用开销?
A) 使用fread代替fgetc批量读取
B) 设置更大的缓冲区
C) 使用mmap内存映射
D) 每次读取单个字节 -
关于文件写入优化,正确的做法包括:
A) 使用内存预分配减少重分配次数
B) 在循环内部频繁调用fflush
C) 使用ostringstream缓存数据后批量写入
D) 每次写入后立即调用fsync确保持久化 -
使用内存映射文件(mmapp)的优势包括:
A) 避免用户空间和内核空间的数据拷贝
B) 自动处理文件并发访问
C) 支持大于内存大小的文件映射
D) 完全替代传统文件IO接口 -
关于缓冲区大小的设置,以下哪些说法正确?
A) 缓冲区大小应设置为内存页面大小的整数倍
B) 缓冲区越大性能越好
C) 1MB通常是机械硬盘的最佳缓冲区大小
D) 应通过基准测试确定最佳大小 -
以下哪些属于零拷贝技术?
A) 使用sendfile系统调用
B) 使用vector存储文件内容
C) 内存映射文件
D) 使用splice进行管道数据传输 -
优化标准输入输出的正确方法包括:
A) 关闭cin与stdio的同步
B) 优先使用endl而不是’\n’
C) 使用getchar/ungetc代替流操作
D) 为cout设置大缓冲区 -
处理大文件时,推荐的做法包括:
A) 使用ifstream的逐行读取
B) 分块处理避免一次性加载
C) 使用内存映射文件
D) 使用realloc动态扩展缓冲区 -
关于文件打开模式优化,正确的有:
A) 二进制模式比文本模式更快
B) 使用ate模式快速定位到文件末尾
C) 同时读写时应使用r+模式
D) 使用direct I/O绕过系统缓存 -
多线程文件处理应注意:
A) 为每个线程分配独立文件描述符
B) 使用互斥锁保护所有文件操作
C) 按固定大小分割文件并行处理
D) 使用异步IO重叠计算和IO -
优化流式数据处理的关键点包括:
A) 避免中间结果持久化
B) 使用原地(in-place)算法
C) 增加临时文件缓存
D) 使用SIMD指令加速处理
二、设计题
- 大文件哈希计算优化
设计一个函数,使用内存映射和分块处理快速计算大文件的SHA256哈希值,要求:
- 支持超过内存大小的文件
- 使用多线程处理不同区块
- 避免不必要的内存拷贝
- 高效日志写入系统
设计一个多线程安全的高性能日志系统,要求:
- 支持批量日志条目合并写入
- 使用双缓冲机制减少锁竞争
- 定时自动刷新缓冲区
- 处理日志文件滚动(rolling)
- 零拷贝文件传输服务
实现一个TCP文件服务器,使用sendfile系统调用实现零拷贝文件传输,要求:
- 支持并发客户端请求
- 正确处理大文件(>4GB)
- 使用epoll实现异步事件处理
- 内存映射管理常用文件
- 实时数据流处理管道
设计一个实时处理管道,从标准输入读取数据,进行压缩后写入网络socket,要求:
- 使用环形缓冲区连接处理阶段
- 实现背压(back-pressure)控制
- 使用splice和tee系统调用减少拷贝
- 支持处理速率统计
- 内存数据库持久化优化
为内存键值数据库设计快速持久化方案,要求:
- 使用copy-on-write机制保证一致性
- 增量持久化更改日志
- 异步刷盘策略
- 崩溃恢复机制
答案与解析
多选题答案
-
ABC
D会增加系统调用,ABC均为有效优化手段。mmap通过映射地址空间避免显式系统调用。 -
AC
B频繁fflush增加开销,D每次fsync严重影响性能。A通过预分配减少重分配,C通过批量写入优化。 -
AC
B错误,mmap不处理并发;D错误,mmap适合特定场景不能完全替代传统IO。 -
AD
B错误,过大的缓冲区可能引起缓存失效;C机械硬盘最佳缓冲区通常为磁盘簇大小的倍数。 -
ACD
sendfile、mmap、splice均可实现零拷贝,vector存储仍需要数据拷贝。 -
AD
B中endl会强制刷新缓冲区影响性能;C中流操作通常更高效。AD是标准IO优化方法。 -
BC
A逐行读取不适合大文件,D动态扩展会产生多次拷贝。BC为处理大文件的有效方法。 -
A
二进制模式跳过了文本转换过程;B中ate模式定位需要系统调用;D需要特定系统支持。 -
AD
B完全加锁会导致性能下降;C文件分割需考虑内容完整性。AD是多线程处理的正确做法。 -
ABD
C增加IO操作,ABD均为流式处理的关键优化点。
设计题答案示例
- 大文件哈希计算优化
#include <openssl/sha.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <thread>
#include <vector>const size_t BLOCK_SIZE = 1 << 21; // 2MB per block
const int NUM_THREADS = 4;void compute_hash_block(unsigned char* addr, size_t size, SHA256_CTX* ctx) {SHA256_Update(ctx, addr, size);
}std::string compute_file_sha256(const char* path) {int fd = open(path, O_RDONLY);struct stat sb;fstat(fd, &sb);size_t file_size = sb.st_size;unsigned char* addr = static_cast<unsigned char*>(mmap(nullptr, file_size, PROT_READ, MAP_PRIVATE, fd, 0));std::vector<SHA256_CTX> contexts(NUM_THREADS);std::vector<std::thread> workers;size_t block_size = file_size / NUM_THREADS;block_size = (block_size + 511) & ~511; // 对齐512字节for (int i = 0; i < NUM_THREADS; ++i) {SHA256_Init(&contexts[i]);size_t offset = i * block_size;size_t size = (i == NUM_THREADS-1) ? (file_size - offset) : block_size;workers.emplace_back(compute_hash_block, addr + offset, size, &contexts[i]);}for (auto& t : workers) t.join();SHA256_CTX final_ctx;SHA256_Init(&final_ctx);for (auto& ctx : contexts) {SHA256_Update(&final_ctx, ctx.h, SHA256_DIGEST_LENGTH);}unsigned char hash[SHA256_DIGEST_LENGTH];SHA256_Final(hash, &final_ctx);munmap(addr, file_size);close(fd);return std::string(reinterpret_cast<char*>(hash), SHA256_DIGEST_LENGTH);
}// 测试用例
int main() {auto hash = compute_file_sha256("large_file.bin");// 输出哈希值...
}
优化点:
- 使用mmap避免双重缓冲
- 分块并行计算
- 内存对齐处理
- 最终哈希合并
- 高效日志写入系统
#include <vector>
#include <mutex>
#include <condition_variable>
#include <atomic>
#include <chrono>class AsyncLogger {std::vector<std::string> front_buffer;std::vector<std::string> back_buffer;std::mutex mtx;std::condition_variable cv;std::atomic<bool> running{true};std::thread flush_thread;const size_t flush_interval = 100; // mspublic:AsyncLogger() {flush_thread = std::thread([this]() {while (running) {std::unique_lock<std::mutex> lock(mtx);cv.wait_for(lock, std::chrono::milliseconds(flush_interval),[this] { return !front_buffer.empty(); });if (!front_buffer.empty()) {back_buffer.swap(front_buffer);lock.unlock();// 实际写入操作write_to_disk(back_buffer);back_buffer.clear();}}});}~AsyncLogger() {running = false;cv.notify_all();flush_thread.join();}void log(const std::string& message) {std::lock_guard<std::mutex> lock(mtx);front_buffer.push_back(message);if (front_buffer.size() >= 1000) {cv.notify_one();}}private:void write_to_disk(const std::vector<std::string>& messages) {// 批量写入实现std::ofstream out("app.log", std::ios::app);for (const auto& msg : messages) {out << msg << "\n";}}
};// 使用示例
int main() {AsyncLogger logger;for (int i = 0; i < 100000; ++i) {logger.log("Log entry " + std::to_string(i));}
}
优化特性:
- 双缓冲减少锁竞争
- 条件变量定时刷新
- 批量写入机制
- 线程安全设计
其他设计题目, 稍后补充
相关文章:
第11章:优化I/O_《C++性能优化指南》_notes
第十一章核心知识点详解 11.1 读取文件的优化技巧 重点:减少内存分配、使用大缓冲区、优化函数调用链。 难点:理解系统调用开销与缓冲区大小的权衡。 代码示例与详解 示例1:使用高效函数签名和减少内存分配 #include <fstream> #inc…...
【C++初阶】--- 内存管理
1.C/C内存分布 我们一般说的32位机器和64位机器指的是虚拟空间的大小,也就是进程地址空间的大小,32位机器下,进程地址空间的大小是232个字节,也就是4G,64位机器下,进程地址空间的大小是264个字节,大概160亿…...
使用 Ansys Discovery 可视化液体池中的水流
了解 ANSYS Discovery:设计领域的变革者 ANSYS Discovery 是一款功能强大的软件工具,能够彻底改变设计流程。借助其先进的仿真功能,工程师现在可以在设计投入生产之前更深入地了解其设计。通过使用 ANSYS Discovery,设计师可以快…...
网络安全-网络安全基础
一、网络安全概述 TCP/IP协议定义了一个对等的开放性网络,使得连接到这个网络中的所有用户都可能面临来自网络中的恶意的破坏和攻击。这些攻击通过网络通信协议、网络应用协议甚至物理传输链路来实现。主要针对于软件和硬件进行攻击。那在互联网上如何保证自己的安…...
YOLOv8+ Deepsort+Pyqt5车速检测系统
该系统通过YOLOv8进行高效的目标检测与分割,结合DeepSORT算法完成目标的实时跟踪,并利用GPU加速技术提升处理速度。系统支持模块化设计,可导入其他权重文件以适应不同场景需求,同时提供自定义配置选项,如显示标签和保存…...
QML中的附加属性和附加信号处理程序
QML中的附加属性和附加信号处理程序 在QML中,附加属性(Attached Properties)和附加信号处理程序(Attached Signal Handlers)是特殊类型的属性和信号,它们由附加类型(Attached Types)提供,而不是由对象本身直接提供。 什么是附加的(Attached…...
爱普生FC-135晶振5G手机的极端温度性能守护者
在5G时代,智能手机不仅需要高速率与低延迟,更需在严寒、酷暑、振动等复杂环境中保持稳定运行。作为 5G 手机的核心时钟源,爱普生32.768kHz晶振FC-135凭借其宽温适应性、高精度稳定性与微型化设计,成为5G手机核心时钟源的理想选择&…...
GPT Workspace体验
GPT Workspace是一款将强大的自然语言处理模型(如 ChatGPT 和 Gemini)集成到 Google Workspace 应用(如 Google Docs, Sheets, Slides, Gmail 和 Drive)中的工具或插件。它的目标是提升用户在日常办公中的效率和创造力。 以下是对…...
Teleport 和 Set Actor location的区别
Teleport 和 Set Actor Location 都可以用于移动一个 Actor 的位置,但它们在底层逻辑和适用场景上有显著区别. 1. Set Actor Location 功能: 直接设置 Actor 的位置,不重置物理状态(如速度、动量)。 行为特点…...
“GPU 挤不动了?”——聊聊基于 GPU 的计算资源管理
“GPU 挤不动了?”——聊聊基于 GPU 的计算资源管理 作者:Echo_Wish “老板:为什么 GPU 服务器卡得跟 PPT 一样?” “运维:我们任务队列爆炸了,得优化资源管理!” 在 AI 训练、深度学习、科学计算的场景下,GPU 计算资源已经成为香饽饽。但 GPU 服务器贵得离谱,一台 A…...
解决前端项目中无法识别 .node 文件的依赖安装问题
解决前端项目中无法识别 .node 文件的依赖安装问题 问题描述 在 macOS 系统(M1 Pro 芯片),使用 Node.js 版本 20.9.0 和 Vue 3 的环境下,项目启动过程中遇到了以下错误: [ERROR] No loader is configured for "…...
Gateway实战入门(四)、断言-请求头以及请求权重分流等
spring cloud-Gateway:断言-请求头以及请求权重分流等 一、断言Header信息要求项目前置环境要求案例一、断言-请求头信息-匹配X-Request-Id1、配置文件及代码2、测试 案例二、断言-请求头信息-匹配API版本场景主要配置信息 案例三、断言-请求头信息:匹配…...
YOLOv11模型的常见处理
一.数据准备: 1.数据集格式: 目录结构示例: datasets/├── images/│ ├── train/ # 训练图片│ └── val/ # 验证图片└── labels/├── train/ # 训练标签└── val/ # 验证标签 每张图片对应一个 .txt 标注文件…...
conda 清除 tarballs 减少磁盘占用 、 conda rename 重命名环境、conda create -n qwen --clone 当前环境
🥇 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️ 文章目录 conda clean --tarballsconda rename 重命名环境conda create -n qwen --clone …...
无线局域网
1.5G支持中低频和高频频段, 2.网络切片是指从应该网络中选取特定的特性和功能 3.WLAN广义指无线电波,激光,红外线等无线信号代替有线局域网中的部分或者全部传输介质所构成的网络。 4.802.11运行在2.4GHz ISM 频段,采用扩频通信…...
百人会上的蔚小理与「来的刚刚好」的雷军
这就是2025百人会上的蔚小理,努力的李斌、宣扬飞行汽车的何小鹏与大讲开源的李想。那么小米汽车的模式是什么呢?站在蔚小理的肩上。 这就是2025百人会上的蔚小理,努力的李斌、宣扬飞行汽车的何小鹏与大讲开源的李想。那么小米汽车的模式是什么…...
现代优雅杂志海报徽标设计手写英文字体安装包 Attomes – Brush Handwritten Font
Attomes 简介 – Brush 手写字体 此字体是一种精致、优雅、流畅的手写字体。它有一个美丽而独特的连字混合字母,因此作者用一个小漩涡嵌入来撰写它,从而形成现代字体,并准备好通过为您的下一个设计项目添加优雅和独特的风格来发表声明。将其…...
Java进阶——静态代理与动态代理
代理模式是一种常用的设计模式,为其他对象提供一种代理以控制对这个对象的访问。代理模式就像是一个中间人,客户端通过代理来间接访问目标对象,可以在不修改目标对象的基础上,对目标对象的功能进行增强或扩展。代理模式主要分为静…...
【多线程】进阶
目录 一、CAS 什么是 CAS CAS 伪代码 CAS 有哪些应用 实现原子类 CAS 是怎么实现的 如何通过 CAS 实现的原子类 CAS 的 ABA 问题 什么是 ABA 问题 ABA 问题引来的 BUG 正常的过程 异常的过程 解决方案 📝相关面试题 二、JUC(java.util.concurrent)的…...
MFC中字符串string类型和CString类型互转方法
文章目录 一、CString 转 std::string1. Unicode项目(_UNICODE 已定义)2. 多字节项目(_MBCS 已定义) 二、std::string 转 CString1. Unicode项目(_UNICODE 已定义)2. 多字节项目(_MBCS 已定义&a…...
工作记录 2017-03-13
工作记录 2017-03-13 序号 工作 相关人员 1 修改邮件上的问题。 开始处理操作日志部分。 测试了C#和MySql的连接。 更新RD服务器。 郝 更新的问题 1、 修改了CMS1500的打印,NDC的内容用了小的字体。 2、在Cliams List中可以查看Job的Notes。 3、Payment Po…...
Linux 配置NFS服务器
1. 开放/nfs/shared目录,供所有用户查阅资料 服务端 (1)安装nfs服务,nfs-utils包中包含rpcbind(rpc守护进程) [rootnode1-server ~]# yum install -y nfs-utils # nfs-utils包中包含rpcbind [rootnode…...
Linux《进程概念(上)》
在之前的Linux学习当中我们已经了解了基本的Linux指令以及基础的开发工具的使用,那么接下来我们就要开始Linux当中一个非常重要的部分的学习——进程,在此进程是我们之后Linux学习的基础,并且通过进程的学习会让我们了解更多的操作系统的相关…...
游戏开发中的贝塞尔曲线:感受丝滑的数学之美
这是一篇vip文章,如果你还不是vip,可以移步https://www.ilikexff.cn/articles/165免费阅读。 介绍 贝塞尔曲线是计算机图形学中最重要的概念之一,以其在表示曲线时的灵活性和精确性而闻名。广泛应用于计算机图形学、动画、路径规划等领域的数学曲线。 贝塞尔曲线的数学原理基…...
Java【多线程】(6)定时器
目录 1.前言 2.正文 2.1库中定时器 2.2手搓定时器 3.小结 1.前言 哈喽大家好呀,今天继续给大家分享Java中定时器的学习,正文包括定时器的三种实现方式,正文如下。 2.正文 在 Java 中,定时器(Timer)…...
Epub转PDF软件Calibre电子书管理软件
Epub转PDF软件:Calibre电子书管理软件 一款好用的电子书管理软件,可快速导入电脑里的电子书并进行管理,支持多种格式,阅读起来非常方便。同时也有电子书格式转换功能。 第一步:添加电子书 将需要转换的电子书添加到…...
使用FastExcel时的单个和批量插入的问题
在我们用excel表进行插入导出的时候,通常使用easyexcel或者FastExcel,而fastexcel是easy的升级版本,今天我们就对使用FastExcel时往数据库插入数据的业务场景做出一个详细的剖析 场景1 现在我们数据库有一张组织表,组织表的字段…...
nginx https配置
一.https配置 HTTPS 协议是由HTTP 加上TLS/SSL 协议构建的可进行加密传输、身份认证的网络协议,主要通过数字证书、加密算法、非对称密钥等技术完成互联网数据传输加密,实现互联网传输安全保护。 1.生成证书 openssl genrsa -des3 -out server.key 20…...
git --- cherry pick
git --- cherry pick cherry pick cherry pick Cherry Pick 是 Git 中的一个操作,它允许你选择某个分支的某次(或多次)提交,并将其应用到当前分支,而不会合并整个分支的所有更改。 cherry pick 的作用 只提取某个特定的…...
虚拟机安装linux系统无法上网的解决方法
在虚拟环境中运行Linux系统时,有时会遇到网络连接问题,特别是在使用虚拟机软件如VMware或VirtualBox时。本文将详细介绍一种针对“虚拟机安装Linux系统无法上网”问题的解决方案,以CentOS 6.5为例,适用于其他基于NAT模式的虚拟机环…...
北大人工智能研究院朱松纯:“中国的AI叙事” 存在认知偏差
3月29日,在2025中关村论坛通用人工智能论坛上,北京通用人工智能学院院长,北京大学人工智能研究院、智能学院院长朱松纯表示,目前,行业对AI的讨论几乎被大模型能力所占据,而基础学科、原始创新与智能本质的研…...
Java高频面试之集合-20
hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶 面试官:讲讲 HashSet 的底层实现? HashSet 是 Java 集合框架中用于存储唯一元素的高效数据结构,其底层实…...
使用Qemu模拟32位ARM系统
一、环境 实验环境如下: 主机:x86_64 操作系统:Ubuntu 20.04.6 LTS Qemu版本:QEMU emulator version 4.2.1 Linux内核版本:linux-4.4.240 Busybox版本:busybox-1.35.0二、前置准备 下载 linux-4.4.240 源…...
【初阶数据结构】栈
文章目录 一、概念与结构 二、栈的实现 栈的定义 1.初始化 2.入栈 3.判断栈是否为空 4.出栈 5.取栈顶元素 6.获取栈中有效元素个数 2.销毁 三、完整码源 总结 一、概念与结构 栈: 一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据…...
docker-compose部署prometheus+grafana+node_exporter
目录 docker-compose文件 配置文件 文件层级关系,docker-compose和配置文件位于同级目录 node_exporter页面json文件 涉及离线包 一.docker-compose文件 [rootsulibao prometheus]# cat docker-compose.yml version: 3services:prometheus:image: registry.c…...
maya调整全局关节显示大小
请按以下步骤操作: 在 Maya 主菜单栏中,找到 Display (显示) 菜单。 在 Display 菜单下,找到 Animation (动画) 子菜单。 在 Animation 子菜单中,点击 Joint Size... (关节大小...)。 这时会弹出一个小窗口或者直接在界面上出现…...
“屏幕“的实现_程序中如何将数据映射到硬件_C++实战
前言 程序里的数据,最后都需要将数据对象写入硬件.C/C最大的优势体现也是在这里,他既是高级语言方便被程序员使用,又能和硬件沟通. 引入 以"屏幕"的实现,总结数据映射到硬件的代码写法 分析 软件部分 1.屏幕是数据对象---一切都是数据,一切都是对象;数据有类型,屏…...
R --- Error in library(***) : there is no package called ‘***’ (服务器非root用户)
步骤 步骤一:在自己目录下创建R包安装路径步骤二:配置用户本地的R库路径步骤三:安装缺失的包(在终端)步骤四:验证安装 步骤一:在自己目录下创建R包安装路径 mkdir -p ~/R_libs步骤二࿱…...
Go中的逃逸分析
什么是逃逸? 逃逸是指一个变量本来应该分配在栈(stack)上,但由于某些原因,最终被分配到了堆(heap)上。 类比: 栈就像一个临时的快餐盒,用来存放短期使用的数据。堆就像…...
解决 Android AGP 最新版本中 BuildConfig 报错问题
在最新版本的 Android Gradle Plugin (AGP) 中,Google 对构建系统做了不少改动,可能会导致一些与 BuildConfig 相关的问题。以下是常见问题及解决方案: 常见问题及修复方法 1. BuildConfig 类完全缺失 原因:AGP 8.0 默认不再为库模…...
Rollup系列之安装和入门
Rollup Rollup.js的主要用途是将小的代码片段编译成更大、更复杂的代码,例如库或应用程序。它特别适用于将ES模块编译成不同的模块形式,如AMD、CommonJS、UMD等,以便在不同的环境中使用。 Rollup的应用场景与好处: 插件或…...
Kafka 4.0 发布:KRaft 替代 Zookeeper、新一代重平衡协议、点对点消息模型、移除旧协议 API
KRaft 全面替代 ZooKeeper Apache Kafka 4.0 是一个重要的里程碑,标志着第一个完全无需 Apache ZooKeeper 运行的主要版本。 通过默认运行在 KRaft 模式下,Kafka 简化了部署和管理,消除了维护单独 ZooKeeper 集群的复杂性。 这一变化显著降…...
MQTT之重复消息(6、在项目中遇到的问题)
项目背景: 在 Spring Boot MQTT 5.0 环境中,RTU设备向SpringBoot平台发送心跳数据、业务监控数据。同时SpringBoot平台可以向RTU设备下发指令,RTU在执行完指令之后向平台发送响应数据。 问题一、SpingBoot平台发送指令给RTU设备,RTU设备能够…...
8、linux c 信号机制
一、信号概述 1. 信号概念 信号是一种在软件层次上对中断机制的模拟,是一种异步通信方式。信号的产生和处理都由操作系统内核完成,用于在进程之间传递信息或通知某些事件的发生。 2. 信号的产生 信号可以通过以下方式产生: 按键产生&…...
Set,Map,WakeSet,WakeMap
简介 Set、Map、WeakMap 和 WeakSet 是 ES6 引入的高级数据结构,它们的底层实现和特性与传统的对象和数组有显著差异 强弱引用了解: link Set Set对象 是一种用于存储 唯一值 的可迭代集合,可存储任意类型的值(原始值、对象引用等&…...
NSSCTF(MISC)—[HITCTF 2021]PNG
相应的做题地址:https://www.nssctf.cn/problem/819 import zlib from Crypto.Cipher import AES import base64 def decode(data, key, iv): cipher AES.new(key, AES.MODE_CBC, iv) decryptByts base64.b64decode(data) msg cipher.decrypt(decryptByts) msgs…...
只出现一次的数字
这个题目动了点脑筋,由于它们时无序的,所以我们如果去找的话比较费劲,可能要循环嵌套再嵌套,所以我们先利用库中自带的sort函数进行排序,把这些数从小到大以此排列,然后我们进行判断哪个数出现了一次即可。…...
【编程中的框架】
编码中常用的框架及其使用方法和好处 框架(Framework)是一种为解决特定问题而设计的软件架构,它提供了一组预定义的组件、模式和工具,帮助开发者更高效地构建应用程序。框架通常不仅仅是方法库,它们提供了一种结构化的…...
Python-常用关键字
基础值 1. False - 意义:布尔类型假值(首字母大写) - 用法示例: if condition is False: print("条件为假") 2. True - 意义:布尔类型真值(首字母大写) - 用法示例&…...
【计算机网络】DHCP工作原理
DHCP(动态主机配置协议) Dynamic Host Configuration Protocol 基于UDP协议传输 DHCP分配IP地址的过程 (1)DHCP DISCOVER客户机请求 IP 地址: 当一个 DHCP 客户机启动时,客户机还没有 IP 地址,所以客户机要通过 DHC…...