DeepSeek协助优化-GTX750Ti文物显卡0.65秒卷完400MB float 音频512阶时域FIR
文章目录
- 1. 学习目的
- 2. 阶段成果
- 2.1 NVVP 性能探查
- 2.2 测试编译环境
- 2.3 测试样例
- 3 学习过程
- 3.1 提问DeepSeek
- 3.2 最终代码
- 4. 体会
1. 学习目的
最近在学习cuda,准备给我的taskBus SDR添加CUDA的模块支持,以便可以用PC机压榨山寨 B210那56M的带宽。
因为年纪比较大了,所以不打算看书了,直接DeepSeek安排上,结果发现学习效率杠杠的!
2. 阶段成果
我用自己的文物显卡 NVIDIA GeForce GTX 750 Ti (Compute Capability 5.0),只有2G的显存,1G的主频,做时域512点fir卷积,竟然只需0.65秒就跑完100M float数据(411MB文件大小)。
关键技术是使用了三个线程进行读写处理分离。
2.1 NVVP 性能探查
使用NVVP,可以看到GPU的占空比还是很紧凑。
主要时间花在了fir_kernel,这是我们希望的。同时,部分时间在进行GPU内部的memCpy,这也是值得进一步优化的方向。
由于磁盘IO完全和CPU计算独立,所以两波计算之间几乎没有空闲。
2.2 测试编译环境
Manjaro 20250321,CUDA12
Intel Core i7 6500K @ 4.0GHz
编译命令:
nvcc -arch=sm_50 cuda_filter.cu -o cuda_filter
注意要使用 -arch=sm_50 选择老的计算兼容选项,否则CUDA启动后会报错。
2.3 测试样例
测试样例是用 AudaCity录制的音频,411MB大小,100MB左右的float32样点(单声道)
滤波器对数据(轨道1)做512点的平均(192KHz采样率下,大概是2秒多)。
3 学习过程
3.1 提问DeepSeek
提问:
使用C语言调用CUDA实现一个连续FIR滤波算法。用户使用该算法的步骤是:
- 打开文件 test.pcm。
- 循环每次读取一定个数(N个)float值,直到文件尾部。
- 对每次读取的float值,调用 push_and_filter() 方法。该方法是你需要着重考虑设计、实现的,作用是接着上次的状态,继续执行连续滤波。滤波器是一个提前定义好的数组,有M个元素,float类型,M目前设置合理范围是16-2048。
- 每次滤波的输出,存储在 out.pcm,连续写入。
- 滤波缓存一开始为全0,尾部也全部清零后结束。
请根据CUDA的特性,分析并设计每次读取的N的个数,让计算尽可能快,并给出全部代码。
回答:
#include <stdio.h>
#include <stdlib.h>
#include <cuda_runtime.h>#define MAX_FILTER_LENGTH 2048
#define OPTIMAL_N 4096 // 根据GPU架构优化的读取块大小
#define BLOCK_SIZE 256 // CUDA线程块大小typedef struct {float* buffer;int size;
} CircularBuffer;__constant__ float d_filter[MAX_FILTER_LENGTH]; // 滤波器系数存储在常量内存// CUDA核函数,使用共享内存优化
__global__ void fir_kernel(const float* input, float* output, int N, int M) {extern __shared__ float s_window[];const int tid = threadIdx.x;const int bid = blockIdx.x;const int gid = bid * blockDim.x + tid;// 每个块加载自己需要的输入窗口const int window_size = blockDim.x + MAX_FILTER_LENGTH - 1;const int input_offset = bid * blockDim.x;// 协作加载数据到共享内存for(int i = tid; i < window_size; i += blockDim.x) {const int load_pos = input_offset + i;s_window[i] = (load_pos < N + M - 1) ? input[load_pos] : 0.0f;}__syncthreads();if(gid < N) { // 确保不越界float sum = 0.0f;for(int j = 0; j < M; j++) {sum += s_window[tid + j] * d_filter[j];}output[gid] = sum;}
}void push_and_filter(CircularBuffer* state, const float* input, int input_len,float** output, int* output_len, int M, cudaStream_t stream) {// 准备扩展输入缓冲区(历史数据 + 新输入)const int total_len = state->size + input_len;float* extended_input = (float*)malloc(total_len * sizeof(float));// 合并历史数据和当前输入memcpy(extended_input, state->buffer, state->size * sizeof(float));memcpy(extended_input + state->size, input, input_len * sizeof(float));// 准备设备内存float *d_input, *d_output;const int output_size = input_len;cudaMalloc(&d_input, total_len * sizeof(float));cudaMalloc(&d_output, output_size * sizeof(float));// 异步内存拷贝和计算cudaMemcpyAsync(d_input, extended_input, total_len * sizeof(float),cudaMemcpyHostToDevice, stream);const dim3 grid_dim((output_size + BLOCK_SIZE - 1) / BLOCK_SIZE);const dim3 block_dim(BLOCK_SIZE);const size_t shared_mem = (BLOCK_SIZE + MAX_FILTER_LENGTH - 1) * sizeof(float);fir_kernel<<<grid_dim, block_dim, shared_mem, stream>>>(d_input, d_output, output_size, M);// 回收历史数据(保留最后M-1个样本)free(state->buffer);state->size = M - 1;state->buffer = (float*)malloc(state->size * sizeof(float));memcpy(state->buffer, extended_input + input_len, state->size * sizeof(float));// 异步获取结果*output = (float*)malloc(output_size * sizeof(float));cudaMemcpyAsync(*output, d_output, output_size * sizeof(float),cudaMemcpyDeviceToHost, stream);cudaStreamSynchronize(stream);*output_len = output_size;free(extended_input);cudaFree(d_input);cudaFree(d_output);
}int main() {// 初始化滤波器系数(示例值)const int M = 512;float h_filter[M];for(int i = 0; i < M; i++) h_filter[i] = 1.0f/M;cudaMemcpyToSymbol(d_filter, h_filter, M * sizeof(float));// 创建CUDA流和状态缓冲区cudaStream_t stream;cudaStreamCreate(&stream);CircularBuffer state = {NULL, 0};FILE *fin = fopen("test.pcm", "rb");FILE *fout = fopen("out.pcm", "wb");float *input_buf = (float*)malloc(OPTIMAL_N * sizeof(float));while(1) {const size_t read_cnt = fread(input_buf, sizeof(float), OPTIMAL_N, fin);if(read_cnt == 0) break;float* output_buf;int output_len;push_and_filter(&state, input_buf, read_cnt, &output_buf, &output_len, M, stream);fwrite(output_buf, sizeof(float), output_len, fout);free(output_buf);} // 清理资源free(input_buf);free(flush_buf);free(state.buffer);fclose(fin);fclose(fout);cudaStreamDestroy(stream);return 0;
}
而后,利用多线程修改,多次互动后,得到最终代码:
3.2 最终代码
#include <stdio.h>
#include <stdlib.h>
#include <cuda_runtime.h>
#include <atomic>
#include <chrono>
#include <thread>
#define MAX_FILTER_LENGTH 2048
#define OPTIMAL_N 1024*1024 // Optimal read block size based on GPU architecture
#define BLOCK_SIZE 256 // CUDA thread block size
#define NUM_STREAMS 4
#define CHECK_CUDA(call) { \cudaError_t err = call; \if (err != cudaSuccess) { \fprintf(stderr, "CUDA error at %s:%d: %s\n", __FILE__, __LINE__, cudaGetErrorString(err)); \exit(EXIT_FAILURE); \} \
}typedef struct {float* buffer;int size;int max_size;
} CircularBuffer;__constant__ float d_filter[MAX_FILTER_LENGTH]; // Filter coefficients in constant memory// CUDA kernel with shared memory optimization
__global__ void fir_kernel(const float* input, float* output, int N, int M) {extern __shared__ float s_window[];const int tid = threadIdx.x;const int bid = blockIdx.x;const int gid = bid * blockDim.x + tid;// Each block loads its needed input windowconst int window_size = blockDim.x + MAX_FILTER_LENGTH - 1;const int input_offset = bid * blockDim.x;// Cooperative data loading into shared memoryfor(int i = tid; i < window_size; i += blockDim.x) {const int load_pos = input_offset + i;s_window[i] = (load_pos < N + M - 1) ? input[load_pos] : 0.0f;}__syncthreads();if(gid < N) { // Ensure we don't go out of boundsfloat sum = 0.0f;for(int j = 0; j < M; j++) {sum += s_window[tid + j] * d_filter[j];}output[gid] = sum;}
}
//用于拼接前序状态的输入缓存
int mem_ext_input_size = 0;
float* mem_ext_input = 0;
//用于CUDA设备侧的输入输出缓存
float *d_input = 0, *d_output = 0;
int d_inputlen = 0, d_outputlen = 0;std::atomic<bool> read_finished(false),deal_finished(false);
std::atomic<long long> read_pos(0);
std::atomic<long long> deal_pos(0);
std::atomic<long long> write_pos(0);//连续滤波函数
void push_and_filter(CircularBuffer* state, const float* input, int input_len,float* output, int * outlen, int M, cudaStream_t stream) {// Prepare extended input buffer (history data + new input)int ext_input_len = state->size + input_len;if (mem_ext_input_size < ext_input_len) {if (mem_ext_input)free(mem_ext_input);mem_ext_input = (float*)malloc(ext_input_len * sizeof(float));mem_ext_input_size = ext_input_len;}// Combine history data with current inputmemcpy(mem_ext_input, state->buffer, state->size * sizeof(float));memcpy(mem_ext_input + state->size, input, input_len * sizeof(float));// Prepare device memoryconst int output_size = input_len;if (d_inputlen < ext_input_len) {if (d_input)cudaFree(d_input);CHECK_CUDA(cudaMalloc(&d_input, ext_input_len * sizeof(float)));d_inputlen = ext_input_len;}if (d_outputlen < output_size) {if (d_output)cudaFree(d_output);CHECK_CUDA(cudaMalloc(&d_output, output_size * sizeof(float)));d_outputlen = output_size;}// Synchronous memory copy//CHECK_CUDA(cudaMemcpy(d_input, mem_ext_input, ext_input_len * sizeof(float), cudaMemcpyHostToDevice));// Async memory operations with streamCHECK_CUDA(cudaMemcpyAsync(d_input, mem_ext_input, ext_input_len * sizeof(float), cudaMemcpyHostToDevice, stream));const dim3 grid_dim((output_size + BLOCK_SIZE - 1) / BLOCK_SIZE);const dim3 block_dim(BLOCK_SIZE);const size_t shared_mem = (BLOCK_SIZE + MAX_FILTER_LENGTH - 1) * sizeof(float);// Kernel launch with default streamfir_kernel<<<grid_dim, block_dim, shared_mem ,stream>>>(d_input, d_output, output_size, M);// Recycle history data (keep last M-1 samples)state->size = M - 1;if (state->max_size < state->size){if (state->buffer )free (state->buffer );state->buffer = (float*)malloc(state->size * sizeof(float));state->max_size = state->size;}memcpy(state->buffer, mem_ext_input + input_len, state->size * sizeof(float));//CHECK_CUDA(cudaMemcpy(output, d_output, output_size * sizeof(float), cudaMemcpyDeviceToHost));CHECK_CUDA(cudaMemcpyAsync(output, d_output, output_size * sizeof(float), cudaMemcpyDeviceToHost, stream));*outlen = output_size;CHECK_CUDA(cudaDeviceSynchronize());return;
}int main() {// Initialize filter coefficients (example values)const int M = 512;float h_filter[M];for(int i = 0; i < M; i++) h_filter[i] = 1.0f/M;CHECK_CUDA(cudaMemcpyToSymbol(d_filter, h_filter, M * sizeof(float)));// Initialize state bufferCircularBuffer state = {NULL, 0 , 0};const int buf_stage = 8;float (*input_buf)[OPTIMAL_N] = new float [buf_stage][OPTIMAL_N];float (*output_buf)[OPTIMAL_N] = new float [buf_stage][OPTIMAL_N];size_t (*input_len) = new size_t [buf_stage];int (*output_len) = new int [buf_stage];//Read threadstd::thread read_thread([&]()->void{FILE *fin = fopen("test.pcm", "rb");while(!read_finished) {if (deal_pos + buf_stage - 2 <= read_pos){//Sleepstd::chrono::milliseconds dura(1);std::this_thread::sleep_for(dura);continue;}const long long pos = read_pos % buf_stage;//Readinput_len[pos] = fread(input_buf[pos], sizeof(float), OPTIMAL_N, fin);if(input_len[pos] < OPTIMAL_N) read_finished = true;if(++read_pos % 10 ==0) fprintf(stderr,"ReadPos = %lld\n",(long long)read_pos);} fclose(fin);});//write threadstd::thread write_thread([&]()->void{FILE *fout = fopen("out.pcm", "wb");while((!deal_finished) || write_pos < deal_pos) {if (write_pos >= deal_pos){//Sleepstd::chrono::milliseconds dura(1);std::this_thread::sleep_for(dura);continue;}const long long pos = write_pos % buf_stage;if (output_len[pos])fwrite(output_buf[pos], sizeof(float), output_len[pos], fout);if (++write_pos % 10 ==0)fprintf(stderr,"WritePos = %lld\n",(long long)write_pos);} fclose(fout);});cudaStream_t streams[buf_stage];for (int i = 0; i < buf_stage; i++) {cudaStreamCreate(&streams[i]);}//Deal in main Threadwhile ((!read_finished) || deal_pos < read_pos ){if (deal_pos >= read_pos){//Sleepstd::chrono::milliseconds dura(1);std::this_thread::sleep_for(dura);continue;}const long long pos = deal_pos % buf_stage;cudaStream_t stream = streams[pos % NUM_STREAMS];push_and_filter(&state, input_buf[pos], input_len[pos], output_buf[pos], &(output_len[pos]), M,stream); if (++deal_pos % 10==0)fprintf(stderr,"DealPos = %lld\n",(long long)deal_pos);}deal_finished = true;read_thread.join();write_thread.join();fprintf(stderr,"Deal Finished.\n");if (state.buffer) free(state.buffer);if (mem_ext_input) free(mem_ext_input);if (d_input) CHECK_CUDA(cudaFree(d_input));if (d_output) CHECK_CUDA(cudaFree(d_output));delete []input_buf;delete []output_buf;delete []input_len;delete []output_len;for (int i = 0; i < NUM_STREAMS; i++) {CHECK_CUDA(cudaStreamDestroy(streams[i]));}return 0;
}
4. 体会
从不熟悉CUDA,到使用CUDA完成了性能还乏善可陈的滤波器,用了4个小时。同时,通过询问DeepSeek如何理解stream流式处理、如何使用Nvidia Visual Profiler的优化指南,了解到很多CUDA相关的周边知识。可见,AI已经使得我这个50岁的人都能学到新东西,更别提年轻人了。现在是只有想不到,没有做不到。
相关文章:
DeepSeek协助优化-GTX750Ti文物显卡0.65秒卷完400MB float 音频512阶时域FIR
文章目录 1. 学习目的2. 阶段成果2.1 NVVP 性能探查2.2 测试编译环境2.3 测试样例 3 学习过程3.1 提问DeepSeek3.2 最终代码 4. 体会 1. 学习目的 最近在学习cuda,准备给我的taskBus SDR添加CUDA的模块支持,以便可以用PC机压榨山寨 B210那56M的带宽。 因…...
Embedding原理
Embedding(嵌入)是将离散符号(如单词)映射到连续向量空间的核心技术,其本质是语义的数学化表示。以下是其核心原理详解: 一、基础概念图解 graph LRA[单词猫] --> B[索引5] --> C[向量[0.2, -1.3,…...
Spark,配置hadoop集群1
配置运行任务的历史服务器 1.配置mapred-site.xml 在hadoop的安装目录下,打开mapred-site.xml,并在该文件里面增加如下两条配置。 eg我的是在hadoop199上 <!-- 历史服务器端地址 --> <property><name>mapreduce.jobhistory.address…...
人工智能大模型-数据预处理-文本数据预处理-图像数据预处理
文本数据预处理 大模型常用的文本数据类型 通用文本数据:网页、对话和图书资料等专用文本数据:多语言文本、科学文本、代码和指令等 构造方法 指令数据:指令(instruction)、输入(input)、输出(output)3部分组成 如果在instruction部分已…...
怎么使用嵌套虚拟环境实现项目部署之virtualenv嵌套conda绕开安装环境检测实现.venv部署facefusion
#工作记录 一、前言 嵌套虚拟环境本来是不建议的一种方法,这种嵌套虚拟环境的使用有一定特殊性,但在一些特别的使用场景下,嵌套虚拟环境的使用非常有用。 二、嵌套虚拟环境: (一)conda嵌套virtualenv 该…...
ansible介绍以及安装
一.ansible介绍 实现对IT基础设施的批量管控,加快效率,节省工作时间。 1.ansible特性 1.基于python开发,开源, 2.基于ssh协议工作。只需要确保ansible机器,与被控制机器能连通就好了, 3.no server 无…...
GPT-4o图像生成功能:技术突破与隐忧并存
2025年3月25日,OpenAI正式推出GPT-4o原生图像生成功能,宣称其实现了“文本到图像的终极跨越”。然而,这一被市场追捧的技术在短短72小时内便因用户需求过载触发限流,暴露出算力瓶颈与商业化矛盾的尖锐性。这场技术狂欢的背后&…...
Java 时间处理:轻松掌握 java.time 包
前言 在 Java 开发中,日期和时间处理一直是令人头疼的问题。传统的 Date 和 Calendar 类不仅复杂,还充满了线程安全和时区处理的坑。Java 8 引入的 java.time 包彻底改变了这一局面,带来了现代化、直观且功能强大的日期时间 API。 本…...
Vue项目中Vuex在util引入,断点存在default
示例代码 // src/store/index.js import Vue from vue; import Vuex from vuex; ……Vue.use(Vuex); export default new Vuex.Store({…… })// src/utils/index.js import store from /store // 导入默认导出的 store export async function getDict() {store.state.userInf…...
2025宁德时代测评Verify考什么?网申测评如何通过SHL笔试|附真题线上笔试考点、高分攻略、CATL新能源科技SHL测评宁德社招题目、面试攻略、求职建议
——职小豚 带你拆解新能源巨头招聘密码 一、宁德时代:新能源赛道「超级独角兽」 作为全球动力电池龙头,宁德时代(CATL)的江湖地位无需多言: 技术硬实力:麒麟电池、钠离子电池、无钴电池等黑科技加持&…...
谈谈常见的数据结构(如数组、链表、栈、队列、哈希表、树、图)及其应用场景
一、数组(Array) 定义:连续存储相同类型数据的线性结构,支持随机访问。 应用场景:列表渲染、数据缓存、算法处理 代码示例: // 数组基本操作 const arr [1, 2, 3, 4]; arr.push(5); // O(1) 平均时间复杂…...
【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的 AOP:实现日志记录与性能监控
答应我,这篇一定要看到最后~! <前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&a…...
【算法】快速幂
一、概念 快速幂是一种高效的指数运算,当指数范围过大时,通过位运算能够减少大量的计算次数 对于,我们通过将指数b转化为二进制数,就可以将分解为许多的(其中i是指数b中对应位为1的位数) 例如࿰…...
使用卷积神经网络识别MNIST数据集
卷积神经网络 卷积神经网络本质是共享权重稀疏链接的全连接网络 编写步骤 构建一个神经网络,步骤是几乎不变的,大概有以下几步 准备数据集 #更高级的CNN网络 import torch import torch.nn as nn import torch.nn.functional as F import torchvisi…...
JavaScript 中数组增删改查
在 JavaScript 中,数组是一种用来存储不同类型的值的数据结构。 增加数组元素: let arr = [1, 2, 3];// 在数组末尾添加元素 arr.push(4); console.log(arr); // [1, 2, 3, 4]// 在数组开头添加元素 arr.unshift(0); console.log(arr); // [0, 1, 2, 3, 4]// 在指定位置插…...
【Kettle安装】Kettle安装过程, 电脑已安装java23,安装Kettle 出现报错:尝试启动 Java 虚拟机(JVM)时失败解决方法
Kettle安装 Kettle 通常指的是 Pentaho Data Integration (PDI),这是一款开源的 ETL(Extract, Transform, Load)工具,用于数据集成、数据清洗和数据分析。它的核心工具名为 Spoon,但整个项目常被直接称为 Kettle 数据…...
Spring笔记04-注解注入
1.导入包 <dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>5.2.7.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId>…...
[动规19] 最大子数组和
目录 1. 题意 2. 思路 2.1. 状态表示 2.2. 状态转移方程 2.3. 初始化 2.4. 填表顺序 2.5. 返回值 3. 编码 1. 题意 链接: 53. 最大子数组和 - 力扣(LeetCode) 题目 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组&…...
2024年零知识证明(ZK)研究进展
Sumcheck 整个领域正在转向更多地依赖于 Sumcheck Protocol Sumcheck是用于验证多项式承诺的协议,常用于零知识证明(ZKP)中,尤其是在可验证计算和扩展性上。它的主要目的是通过对多项式进行分段检查,从而保证某个多项…...
1. 两数之和
leetcode Hot 100系列 文章目录 一、核心操作二、外层配合操作三、核心模式代码总结 一、核心操作 使用map,key作为数值,value作为下标先寻找对应的目标值,如果找到了则直接返回,否则在往map中插入 提示:小白个人理…...
【电动汽车再生制动控制技术(万字长文,图文并茂)】
电动汽车再生制动控制系统概述 电动汽车再生制动的基本原理是:通过具有可逆作用的电动机/发电机来实现电动汽车动能和电能的转化。在汽车减速或制动时,可逆电机以发电机形式工作,汽车行驶的动能带动发电机将汽车动能转化为电能并储存在储能器(蓄电池或超级电容器)中;在汽车…...
python实现股票数据可视化
最近在做一个涉及到股票数据清洗及预测的项目,项目中需要用到可视化股票数据这一功能,这里我与大家分享一下股票数据可视化的一些基本方法。 股票数据获取 目前,我已知的使用python来获取股票数据方式有以下三种: 爬虫获取,实现…...
2025年湖南建筑安全员 C1考证刷题题库
湖南建筑安全员 C1 类的练习题: 1、塔机的拆装作业必须在白天进行,不得在( )情况下进行。 A. 夜间 B. 大风 C. 浓雾 D. 以上都是 答案:D 2、采用钢筋混凝土灌注桩时,开挖标准是桩身混凝土达到&#…...
【Feign】⭐️使用 openFeign 时传递 MultipartFile 类型的参数参考
💥💥✈️✈️欢迎阅读本文章❤️❤️💥💥 🏆本篇文章阅读大约耗时三分钟。 ⛳️motto:不积跬步、无以千里 📋📋📋本文目录如下:🎁🎁&a…...
ToolsSet之:梯度色板
ToolsSet是微软商店中的一款包含数十种实用工具数百种细分功能的工具集合应用,应用基本功能介绍可以查看以下文章: Windows应用ToolsSet介绍https://blog.csdn.net/BinField/article/details/145898264 ToolsSet中Media菜单下的“Gradient Palette”工…...
Apache Hive和Snowflake的`CREATE VIEW`语法和功能特性整理的对比表
写一个Apache Hive中CREATE VIEW语句转换为对应Snowflake中CREATE VIEW语句的程序,现在需要一个根据功能的相似性对应的Apache HiveQL和Snowflake SQL的CREATE VIEW语句的表。 以下是基于Apache Hive的CREATE VIEW语法规则构造的所有可能合法语句实例及其功能说明&…...
【测试】每日3道面试题 3/31
长期更新,建议关注收藏点赞。 单元测试策略有哪些,主要内容。 白盒测试黑盒测试基于异常和边界的测试 主要内容:测试用例设计、执行、结果分析、自动化beta测试和alpha测试主要区别 主要区别:测试环境测试者 alphabeta时间先后测…...
用 Hugging Face Spaces 打造哪吒的 3D 模型:完整指南
引言: 哪吒,这位中国神话中的传奇人物,以其独特的形象和故事深受人们喜爱。如今,通过 Hugging Face Spaces 提供的 TripoSG 工具,我们可以轻松创建哪吒的 3D 模型。以下是详细步骤,帮助你将这个神话角色带入…...
鸿蒙应用元服务开发-Account Kit概述
Account Kit(华为账号服务)提供简单、快速、安全的登录功能,让用户快捷地使用华为账号登录元服务。用户授权后,Account Kit可提供头像、手机号码等信息,帮助元服务更了解用户。Account Kit提供的SampleCode示例工程体现…...
美团小程序 mtgsig1.2 拼好饭案例 分析 mtgsig
声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 逆向分析 美团网页、小程序、app全是指…...
hadoop集群和常用命令
Hadoop集群的搭建与管理 1. HADOOP简介 Hadoop 是一种用于大规模数据处理的大数据框架,支持通过简单编程模型实现跨计算机集群的数据分布存储和计算3。 2. HADOOP集群部署过程 (1) 解压并安装HADOOP 在虚拟机环境中,可以通过解压缩方式完成Hadoop的安…...
爬虫:基本流程和robots协议
基本流程: 1.确认目标:url:www.baidu.com 2.发送请求:发送网络请求,获取到特定的服务端给你的响应 3.提取数据:从响应中提取特定的数据 4.保存数据:本地(html,json,txt),数据库 获取到的响应…...
python之三种去重方法
1. 数据读取与参数解析 代码片段 detail pd.read_csv(detail.csv, index_col0, encodinggbk)数据实例 参数详解 index_col0: 作用:将第1列设置为索引其他选项: None:不指定索引列(默认)列序号/列名&…...
QML输入控件: TextField(文本框)的样式定制
目录 引言示例简介示例代码与关键点示例1:基础样式定制示例2:添加图标示例3:交互式元素(清除按钮) 实现要点总结完整工程下载 引言 在Qt Quick应用程序开发中,文本输入是最常见的用户交互方式之一。TextFi…...
Visual Studio | 性能探测器
文章目录 一、性能探测器1、核心功能2、数据采集3、数据分析3.1、CPU分析 前言: Visual Studio(VS)提供的性能探测器(Performance Profiler)是一款强大的工具,它能够帮助开发者分析应用程序的性能ÿ…...
数据库中的函数:高效操作与灵活运用
数据库中的函数:高效操作与灵活运用 在数据库开发过程中,函数是常用的工具,可以帮助我们更高效地处理和操作数据。无论是对字符串、数值、日期还是流程控制,数据库函数都能够提供强大的支持。本文将深入探讨常见的数据库函数&…...
《非暴力沟通》第十二章 “重获生活的热情” 总结
《非暴力沟通》第十二章 “重获生活的热情” 的核心总结: 本章将非暴力沟通的核心理念延伸至生命意义的探索,提出通过觉察与满足内心深处的需要,打破“义务性生存”的桎梏,让生活回归由衷的喜悦与创造。作者强调,当行动…...
C++位运算精要:高效解题的利器
引言 在算法竞赛和底层开发中,位运算(Bit Manipulation)因其极高的执行效率而广受青睐。它能在O(1)时间复杂度内完成某些复杂操作,大幅优化程序性能。本文系统梳理C位运算的核心技巧,涵盖基础操作、经典应用、优化策略…...
从两种遍历方法中构造二叉树
从前序与中序遍历序列构造二叉树 题目描述 代码实现 class Solution { private:unordered_map<int, int> mapIn;TreeNode* dfs(vector<int>& preorder, vector<int>& inorder, int pre_left, int pre_right, int in_left, int in_right){//出口if(…...
【C语言】字符函数的易错点及其模拟实现
在上一章为大家简单介绍了字符函数的种类和基础运用,语法。那么在本章为大家分享一些易错点和自己如何编写一个自定义函数来实现相同的作用。(点个关注呗) 一strlen:计算字符串长度 1. 函数原型 size_t strlen(const char *str…...
【前端】创建一个vue3+JavaScript项目流程
1、检查node和npm是否安装,查看版本: node -v npm -v 2、安装脚手架cli或vite (1)cli 安装:npm install -g vue/cli 检查是否安装成功:vue -v 使用cli创建项目:vue create my-project(项目名)--…...
JVM面试专题
目录 1 JVM组成 1.1 JVM由那些部分组成,运行流程是什么? 1.2 什么是程序计数器? 1.3 你能给我详细的介绍Java堆吗? 元空间(MetaSpace)介绍 1.4 什么是虚拟机栈 1.5 方法区 1.5.1 概述 1.5.2 常量池 1.5.3 运行时常量池 1.6 你听过…...
齐次线性方程组及python求解
齐次线性方程组的概念 齐次线性方程组是指所有常数项都为零的线性方程组,其一般形式为: a 11 x 1 a 12 x 2 ⋯ a 1 n x n 0 a_{11}x_1 a_{12}x_2 \cdots a_{1n}x_n 0 a11x1a12x2⋯a1nxn0 a 21 x 1 a 22 x 2 ⋯ a 2 n x n 0 a_…...
鸿蒙前后端项目源码-点餐v3.0-原创!原创!原创!
鸿蒙前后端点餐项目源码含文档ArkTS语言. 原创作品.我半个月写的原创作品,请尊重原创。 原创作品,盗版必究!!!! 原创作品,盗版必究!!!! 原创作…...
【数据结构】算法效率的双刃剑:时间复杂度与空间复杂度
前言 在算法的世界里,效率是衡量算法优劣的关键标准。今天,就让我们深入探讨算法效率的两个核心维度:时间复杂度和空间复杂度,帮助你在算法设计的道路上更进一步。 一、算法效率:衡量算法好坏的关键 算法的效率主要…...
Linux | I.MX6ULL 终结者底板原理图讲解(5)
01 USB 转串口电路 I.MX6ULL 终结者开发板板载了一个 USB 串口,原理图如图 1 和图 2 所示: USB 转串口我们使用的是 CH340G 芯片,该芯片是由南京沁恒微电子研发生产的一款国产芯片。CH340G的工作电压支持 3.3V、5V,甚至是 3V,从上图可以看到我们给 CH340G 的电压是 5V…...
java拆分字符串、去重并统计相关长度
java拆分字符串、去重并统计相关长度 20250331 19:52 求取逗号隔开的字符串的 的长度,要求去重。拆分字符串应该是指按照某种分隔符将字符串分割成多个部分,然后去除重复的部分,最后统计处理后各个部分的长度或者总长度。 这时候可能需要明确…...
Vue 2 和 Vue 3 有什么区别
Vue 2 和 Vue 3 是 Vue.js 框架的两个主要版本,它们在核心特性、性能、API 设计等方面有一些显著的区别。以下是它们的主要区别: 1. 核心特性 • Composition API: • Vue 3 引入了 Composition API,这是一种新的 API࿰…...
RabbitMQ、RocketMQ 和 Kafka 的消息特性对比
以下是 RabbitMQ、RocketMQ 和 Kafka 在保证消息不丢失、消息顺序、消息幂等性以及快速处理积压方面的详细对比: 1. 消息不丢失 特性RabbitMQRocketMQKafka生产者端开启事务或 Confirm 模式使用事务消息机制设置 acksall 确保消息被所有副本确认服务端消息持久化&…...
Logback 实现不同包的日志记录到不同文件
核心 通过合理配置多个 appender 来定义不同的日志输出目的地通过 logger 元素将不同的包与对应的 appender 关联起来同时利用 additivity 属性控制日志的传递,从而实现精准的日志输出管理。 additivity 属性控制日志传递: additivity 属性决定了该 l…...