深入解析:昇腾CANN训练营 学习(day3)昇腾AI处理器开发环境构建与实践指南

news/2025/12/7 15:36:14/文章来源:https://www.cnblogs.com/yangykaifa/p/19318227

训练营简介

报名链接​https://www.hiascend.com/developer/activities/cann20252#cann-camp-2502-intro

目录

第一章 环境架构设计与系统要求

1.1 环境架构选择

1.2 硬件要求详解

1.3 系统兼容性验证

第二章 系统环境准备与实践

2.1 依赖包安装脚本

2.2 Python环境精准配置

2.3 系统参数优化配置

第三章 CANN软件安装与配置

3.1 CANN安装前验证

3.2 CANN软件安装脚本

3.3 环境变量配置

第四章 开发环境验证与测试

4.1 基础环境验证

4.2 示例算子编译测试

第五章 分设环境部署方案

5.1 开发环境配置

5.2 运行环境准备脚本

第六章 故障排查与维护

6.1 常见问题诊断

6.2 日志收集脚本

第七章 持续集成集成方案

7.1 CI/CD流水线配置

7.2 自动化测试框架

总结


第一章 环境架构设计与系统要求

1.1 环境架构选择

在实际开发中,环境架构的选择直接影响开发效率和部署流程。以下是两种架构的具体实现方案:

合设环境验证命令:

bash

# 检查是否配备昇腾AI处理器
lspci | grep -i npu
# 预期输出:应显示昇腾AI设备信息
# 检查处理器型号
npu-smi info
# 预期输出:显示设备型号、算力等信息

分设环境网络配置:

bash

# 开发环境到运行环境的SSH配置
ssh-copy-id -i ~/.ssh/id_rsa.pub user@runtime_host
# 配置免密登录,便于自动化部署
# 验证网络连通性
ping -c 4 runtime_host
# 检查网络延迟和稳定性
1.2 硬件要求详解

昇腾AI处理器有不同的算力规格,需根据项目需求选择:

bash

# 检查硬件详细信息
npu-smi info -t board -i 0
# 输出设备温度、功耗、内存等信息
# 验证算力能力
cat /proc/driver/npu/hisi/npu0/ability
# 查看支持的算力特性
1.3 系统兼容性验证

不同操作系统需要特定的内核版本和驱动支持:

bash

# 检查内核版本
uname -r
# 要求:Ubuntu 18.04/20.04 (内核4.15/5.4+)
# 或 CentOS 7.6/8.2 (内核3.10/4.18+)
# 验证GCC版本
gcc --version
# 要求:GCC 7.3.0或以上
# 检查GLIBC版本
ldd --version
# 要求:GLIBC 2.17或以上
第二章 系统环境准备与实践
2.1 依赖包安装脚本

针对不同操作系统,提供完整的依赖安装方案:

Ubuntu系统安装脚本:

bash

#!/bin/bash
# ubuntu_deps_install.sh
set -e
echo "开始安装Ubuntu系统依赖..."
# 更新软件源
apt-get update
# 安装基础开发工具
apt-get install -y gcc g++ make cmake build-essential
# 安装数学计算库
apt-get install -y libblas-dev liblapack-dev gfortran
# 安装Python开发环境
apt-get install -y python3-dev python3-pip python3-venv
# 安装系统工具
apt-get install -y pciutils net-tools usbutils
# 安装压缩和加密库
apt-get install -y zlib1g zlib1g-dev openssl libssl-dev
# 安装其他开发库
apt-get install -y libsqlite3-dev libffi-dev unzip curl wget
echo "Ubuntu系统依赖安装完成"

CentOS/openEuler系统安装脚本:

bash

#!/bin/bash
# centos_deps_install.sh
set -e
echo "开始安装CentOS系统依赖..."
# 安装EPEL源(CentOS需要)
yum install -y epel-release
# 安装基础开发工具
yum install -y gcc gcc-c++ make cmake
# 安装数学计算库
yum install -y blas-devel lapack-devel gcc-gfortran
# 安装Python开发环境
yum install -y python3-devel python3-pip
# 安装系统工具
yum install -y pciutils net-tools usbutils
# 安装开发库
yum install -y zlib-devel openssl-devel libffi-devel sqlite-devel
echo "CentOS系统依赖安装完成"
2.2 Python环境精准配置

Python环境配置需要特别注意版本兼容性:

bash

#!/bin/bash
# python_env_setup.sh
# 检查现有Python版本
python3 --version
pip3 --version
# 创建Python虚拟环境
python3 -m venv ~/ascend_venv
# 激活虚拟环境
source ~/ascend_venv/bin/activate
# 升级pip
pip install --upgrade pip
# 安装基础依赖包
pip install attrs==21.4.0
pip install numpy==1.21.6
pip install decorator==4.4.2
pip install sympy==1.7.1
pip install cffi==1.15.0
pip install pyyaml==5.4.1
pip install pathlib2==2.3.7
pip install psutil==5.9.0
pip install protobuf==3.20.1
pip install scipy==1.7.3
pip install requests==2.27.1
pip install absl-py==1.0.0
pip install wheel==0.37.1
pip install typing_extensions==4.1.1
# 验证安装
python -c "import numpy; print(f'NumPy版本: {numpy.__version__}')"
python -c "import scipy; print(f'SciPy版本: {scipy.__version__}')"
echo "Python环境配置完成"
2.3 系统参数优化配置

为提升性能,需要进行系统级调优:

bash

#!/bin/bash
# system_optimization.sh
# 配置共享内存
echo "vm.vfs_cache_pressure = 50" >> /etc/sysctl.conf
echo "vm.swappiness = 10" >> /etc/sysctl.conf
# 配置内存管理
echo "vm.dirty_ratio = 15" >> /etc/sysctl.conf
echo "vm.dirty_background_ratio = 5" >> /etc/sysctl.conf
# 配置网络参数
echo "net.core.rmem_max = 16777216" >> /etc/sysctl.conf
echo "net.core.wmem_max = 16777216" >> /etc/sysctl.conf
# 配置文件句柄数
echo "* soft nofile 65536" >> /etc/security/limits.conf
echo "* hard nofile 65536" >> /etc/security/limits.conf
# 应用配置
sysctl -p
# 创建大页内存
echo "1024" > /proc/sys/vm/nr_hugepages
echo "系统优化完成"
第三章 CANN软件安装与配置
3.1 CANN安装前验证

在安装CANN之前需要进行全面的环境检查:

bash

#!/bin/bash
# pre_install_check.sh
echo "=== 开始CANN安装前环境检查 ==="
# 检查磁盘空间
echo "1. 检查磁盘空间:"
df -h /usr/local
# 检查内存大小
echo -e "\n2. 检查内存:"
free -h
# 检查用户权限
echo -e "\n3. 检查用户权限:"
if [ "$EUID" -eq 0 ]; thenecho "当前为root用户"
elseecho "请使用root权限运行安装"exit 1
fi
# 检查依赖包
echo -e "\n4. 检查关键依赖:"
for pkg in gcc cmake python3 pip3; doif command -v $pkg &> /dev/null; thenecho "✓ $pkg 已安装"elseecho "✗ $pkg 未安装"fi
done
# 检查当前进程
echo -e "\n5. 检查是否有冲突进程:"
if pgrep -f "npu" > /dev/null; thenecho "发现npu相关进程,请停止后重试"exit 1
fi
echo "=== 环境检查完成 ==="
3.2 CANN软件安装脚本

提供完整的CANN安装自动化脚本:

bash

#!/bin/bash
# cann_installation.sh
set -e
CANN_PACKAGE="Ascend-cann-toolkit_7.0.0_linux-x86_64.run"
INSTALL_PATH="/usr/local/Ascend"
echo "开始安装CANN开发套件..."
# 验证安装包完整性
if [ ! -f "$CANN_PACKAGE" ]; thenecho "错误:安装包 $CANN_PACKAGE 不存在"exit 1
fi
# 添加执行权限
chmod +x "$CANN_PACKAGE"
# 检查安装包完整性
echo "正在验证安装包完整性..."
./"$CANN_PACKAGE" --check
if [ $? -ne 0 ]; thenecho "安装包验证失败"exit 1
fi
# 创建安装目录
mkdir -p "$INSTALL_PATH"
# 执行安装(静默模式)
echo "开始安装CANN工具包..."
./"$CANN_PACKAGE" --install --install-path=$INSTALL_PATH --quiet
# 验证安装结果
if [ -d "$INSTALL_PATH/ascend-toolkit" ]; thenecho "✓ CANN工具包安装成功"
elseecho "✗ CANN工具包安装失败"exit 1
fi
echo "CANN安装完成"
3.3 环境变量配置

环境变量配置对开发至关重要:

bash

#!/bin/bash
# ascend_env_setup.sh
ASCEND_PATH="/usr/local/Ascend"
ASCEND_TOOLKIT="$ASCEND_PATH/ascend-toolkit"
# 创建环境配置脚本
cat > /etc/profile.d/ascend.sh << 'EOF'
#!/bin/bash
export ASCEND_HOME=/usr/local/Ascend
export ASCEND_TOOLKIT_HOME=$ASCEND_HOME/ascend-toolkit
# 添加二进制路径
export PATH=$ASCEND_TOOLKIT_HOME/bin:$PATH
# 添加库路径
export LD_LIBRARY_PATH=$ASCEND_TOOLKIT_HOME/lib64:$ASCEND_TOOLKIT_HOME/fwkacllib/lib64:$LD_LIBRARY_PATH
# Python路径
export PYTHONPATH=$ASCEND_TOOLKIT_HOME/python/site-packages:$ASCEND_TOOLKIT_HOME/fwkacllib/python/site-packages:$PYTHONPATH
# 算子编译路径
export ASCEND_OPP_PATH=$ASCEND_HOME/opp
# AI处理器相关配置
export ASCEND_AICPU_PATH=$ASCEND_TOOLKIT_HOME
# 日志级别
export ASCEND_GLOBAL_LOG_LEVEL=1
# 事件级别
export ASCEND_GLOBAL_EVENT_ENABLE=0
# SOC版本(根据实际设备修改)
export SOC_VERSION=Ascend910
EOF
# 使配置立即生效
source /etc/profile.d/ascend.sh
echo "环境变量配置完成"
第四章 开发环境验证与测试
4.1 基础环境验证

提供完整的验证脚本来确认环境就绪:

bash

#!/bin/bash
# environment_validation.sh
echo "=== 开始环境验证 ==="
# 1. 验证驱动加载
echo "1. 验证NPU驱动:"
if lsmod | grep -q "npu"; thenecho "✓ NPU驱动已加载"
elseecho "✗ NPU驱动未加载"exit 1
fi
# 2. 验证设备识别
echo -e "\n2. 验证设备识别:"
npu-smi info
if [ $? -eq 0 ]; thenecho "✓ 设备识别成功"
elseecho "✗ 设备识别失败"exit 1
fi
# 3. 验证CANN安装
echo -e "\n3. 验证CANN安装:"
if [ -d "/usr/local/Ascend/ascend-toolkit" ]; thenecho "✓ CANN安装验证通过"
elseecho "✗ CANN安装目录不存在"exit 1
fi
# 4. 验证环境变量
echo -e "\n4. 验证环境变量:"
if [ -n "$ASCEND_HOME" ]; thenecho "✓ ASCEND_HOME: $ASCEND_HOME"
elseecho "✗ ASCEND_HOME未设置"exit 1
fi
# 5. 验证Python环境
echo -e "\n5. 验证Python环境:"
python3 -c "
import sys
try:import teimport topiprint('✓ Python接口导入成功')
except ImportError as e:print(f'✗ Python接口导入失败: {e}')sys.exit(1)
"
# 6. 验证编译工具链
echo -e "\n6. 验证编译工具链:"
if command -v aicc > /dev/null; thenecho "✓ 编译工具链就绪"
elseecho "✗ 编译工具链未找到"exit 1
fi
echo -e "\n=== 所有环境验证通过 ==="
4.2 示例算子编译测试

创建简单的测试算子验证开发环境:

向量加法算子代码:

c++

// vector_add.cpp
#include 
#include "acl/acl.h"
class VectorAdd {
public:VectorAdd() {// 初始化aclError ret = aclInit(nullptr);if (ret != ACL_SUCCESS) {std::cerr << "ACL初始化失败: " << ret << std::endl;return;}// 设置设备ret = aclrtSetDevice(0);if (ret != ACL_SUCCESS) {std::cerr << "设置设备失败: " << ret << std::endl;return;}std::cout << "VectorAdd初始化成功" << std::endl;}~VectorAdd() {aclrtResetDevice(0);aclFinalize();std::cout << "VectorAdd资源释放完成" << std::endl;}void Run() {const size_t size = 1024;float* h_data1 = new float[size];float* h_data2 = new float[size];float* h_result = new float[size];// 初始化数据for (size_t i = 0; i < size; ++i) {h_data1[i] = static_cast(i);h_data2[i] = static_cast(i * 2);}// 执行向量加法(这里简化,实际应在设备端执行)for (size_t i = 0; i < size; ++i) {h_result[i] = h_data1[i] + h_data2[i];}// 验证结果bool success = true;for (size_t i = 0; i < size; ++i) {if (h_result[i] != h_data1[i] + h_data2[i]) {success = false;break;}}if (success) {std::cout << "向量加法测试通过" << std::endl;} else {std::cout << "向量加法测试失败" << std::endl;}delete[] h_data1;delete[] h_data2;delete[] h_result;}
};
int main() {VectorAdd add_test;add_test.Run();return 0;
}

编译脚本:

bash

#!/bin/bash
# build_test.sh
echo "开始编译测试程序..."
# 设置编译环境
source /usr/local/Ascend/ascend-toolkit/set_env.sh
# 编译命令
g++ -std=c++11 vector_add.cpp \-I/usr/local/Ascend/ascend-toolkit/include \-L/usr/local/Ascend/ascend-toolkit/lib64 \-lascendcl -lpthread -lm \-o vector_add_test
if [ $? -eq 0 ]; thenecho "✓ 编译成功"./vector_add_test
elseecho "✗ 编译失败"exit 1
fi
第五章 分设环境部署方案
5.1 开发环境配置

在分设环境中,开发环境需要特定的配置:

bash

#!/bin/bash
# dev_env_setup.sh
echo "配置开发环境..."
# 安装交叉编译工具
apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
# 创建远程部署脚本
cat > deploy_to_runtime.sh << 'EOF'
#!/bin/bash
REMOTE_HOST="user@runtime_host"
REMOTE_PATH="/home/user/ascend_projects"
# 同步代码和模型
rsync -avz --delete \--exclude 'build' \--exclude '*.o' \--exclude '*.so' \./ $REMOTE_HOST:$REMOTE_PATH/
# 在远程环境执行构建
ssh $REMOTE_HOST "cd $REMOTE_PATH && source /usr/local/Ascend/ascend-toolkit/set_env.sh && ./build.sh"
echo "部署完成"
EOF
chmod +x deploy_to_runtime.sh
echo "开发环境配置完成"
5.2 运行环境准备脚本

运行环境需要精简的配置:

bash

#!/bin/bash
# runtime_env_setup.sh
echo "配置运行环境..."
# 创建运行环境检查脚本
cat > runtime_check.sh << 'EOF'
#!/bin/bash
echo "=== 运行环境状态检查 ==="
# 检查NPU状态
echo "1. NPU设备状态:"
npu-smi info
# 检查内存使用
echo -e "\n2. 内存状态:"
free -h
# 检查存储空间
echo -e "\n3. 存储状态:"
df -h
# 检查关键进程
echo -e "\n4. 进程状态:"
ps aux | grep -E "(npu|ascend)" | grep -v grep
echo "=== 检查完成 ==="
EOF
chmod +x runtime_check.sh
# 创建性能监控脚本
cat > monitor_perf.sh << 'EOF'
#!/bin/bash
while true; doclearecho "=== 昇腾设备监控 ==="npu-smi infoecho -e "\n=== 系统资源 ==="top -bn1 | head -10sleep 2
done
EOF
chmod +x monitor_perf.sh
echo "运行环境配置完成"
第六章 故障排查与维护
6.1 常见问题诊断

提供诊断脚本帮助定位问题:

bash

#!/bin/bash
# diagnose_issues.sh
echo "=== 开始系统诊断 ==="
# 检查内核消息
echo "1. 检查内核日志:"
dmesg | grep -i npu | tail -10
# 检查设备节点
echo -e "\n2. 检查设备节点:"
ls -la /dev/davinci*
# 检查驱动版本
echo -e "\n3. 检查驱动版本:"
cat /proc/driver/npu/hisi/npu0/version
# 检查库依赖
echo -e "\n4. 检查库依赖:"
ldd /usr/local/Ascend/ascend-toolkit/bin/main 2>/dev/null | grep "not found"
# 检查权限问题
echo -e "\n5. 检查设备权限:"
ls -la /dev/davinci0
# 检查服务状态
echo -e "\n6. 检查相关服务:"
systemctl status ascend_npu 2>/dev/null || echo " ascend_npu服务未找到"
echo "=== 诊断完成 ==="
6.2 日志收集脚本
#!/bin/bash
# collect_logs.sh
LOG_DIR="ascend_logs_$(date +%Y%m%d_%H%M%S)"
mkdir -p $LOG_DIR
echo "收集日志到目录: $LOG_DIR"
# 系统信息
uname -a > $LOG_DIR/system_info.log
lspci | grep -i npu > $LOG_DIR/pci_info.log
# NPU信息
npu-smi info > $LOG_DIR/npu_info.log 2>&1
# 环境变量
env | grep -i ascend > $LOG_DIR/ascend_env.log
# 包信息
dpkg -l | grep -i ascend > $LOG_DIR/package_info.log 2>&1 || rpm -qa | grep -i ascend > $LOG_DIR/package_info.log 2>&1
# 日志文件
cp -r /var/log/ascend_seclog $LOG_DIR/ 2>/dev/null || true
cp /var/log/npu* $LOG_DIR/ 2>/dev/null || true
# 创建压缩包
tar -czf $LOG_DIR.tar.gz $LOG_DIR
echo "日志收集完成: $LOG_DIR.tar.gz"
第七章 持续集成集成方案
7.1 CI/CD流水线配置
# .gitlab-ci.yml
stages:- build- test- deploy
variables:ASCEND_HOME: "/usr/local/Ascend"
build:stage: buildscript:- source $ASCEND_HOME/ascend-toolkit/set_env.sh- mkdir -p build && cd build- cmake ..- make -j$(nproc)artifacts:paths:- build/*.so- build/test_runner
test:stage: testscript:- source $ASCEND_HOME/ascend-toolkit/set_env.sh- cd build && ./test_runnerdependencies:- build
deploy_to_runtime:stage: deployscript:- scp -r build/*.so user@runtime_host:/opt/ascend_app/- scp -r models user@runtime_host:/opt/ascend_app/only:- main
7.2 自动化测试框架
#!/usr/bin/env python3
# test_framework.py
import unittest
import subprocess
import sys
import os
class AscendEnvironmentTest(unittest.TestCase):def test_npu_availability(self):"""测试NPU设备可用性"""result = subprocess.run(['npu-smi', 'info'],capture_output=True, text=True)self.assertEqual(result.returncode, 0,"npu-smi命令执行失败")def test_ascend_libraries(self):"""测试Ascend库加载"""try:import teimport tbeimport topiself.assertTrue(True, "库导入成功")except ImportError as e:self.fail(f"库导入失败: {e}")def test_compiler_availability(self):"""测试编译器可用性"""compilers = ['aicc', 'aarch64-linux-gnu-gcc']for compiler in compilers:with self.subTest(compiler=compiler):result = subprocess.run(['which', compiler],capture_output=True)self.assertEqual(result.returncode, 0,f"编译器 {compiler} 未找到")
if __name__ == '__main__':# 添加Ascend Python路径ascend_path = "/usr/local/Ascend/ascend-toolkit/python/site-packages"sys.path.insert(0, ascend_path)unittest.main(verbosity=2)
总结

本文详细介绍了昇腾AI处理器开发环境的完整构建流程,从基础环境准备到高级功能验证,提供了大量可直接使用的脚本和代码示例。通过遵循本文的指导,开发者可以快速搭建稳定可靠的开发环境,为后续的AI应用开发和性能优化奠定坚实基础。

实际开发中,建议根据具体项目需求调整环境配置,并建立完善的监控和维护机制。随着昇腾生态的不断发展,建议持续关注官方文档更新,及时获取最新的工具和最佳实践。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/991525.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习中交叉验证(CV)、CV fold(交叉验证折) 和 数据泄露 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

CF2174D tutorial

English version Hints How to choose the edges greedily? In which cases does the greedy method fail? How can we find the extra non-tree edges? Solution Step1 First, sort the edges by weight. If the f…

Python 基础语法:简单易懂的入门指南(含实战代码)

Python 以 “简洁、易读、灵活” 著称,核心语法贴近自然语言,是编程入门的首选。以下用大白话 + 实战代码,带你吃透 Python 基础核心知识点,零基础也能快速上手! 一、先搞懂 3 个核心前提解释型语言:写完代码直接…

Say 赛选记(11.27)

noip 前的最后一篇了(悲 AT_arc171_d [ARC171D] Rolling Hash 众所周知,\([l,r]\) 的哈希值是可以用前缀相减来算的,也就是 \(s_r - s_{l - 1} \times B^{r - l + 1}\),但这个形式在这道题中就力不从心了。 换一个…

.NET异步编程进阶:从语法糖到高性能架构的核心突破

深入探讨如何智能地结合I/O和CPU工作、避免隐藏的线程池成本,以及使用新的.NET功能使异步比以往更安全、更快速。 .NET异步编程进阶:从语法糖到高性能架构的核心突破 在每个.NET开发者的职业生涯中,都会有一个转折…

AI元人文:价值共生时代的元操作系统——理论架构、深层辩护与演进蓝图

AI元人文:价值共生时代的元操作系统——理论架构、深层辩护与演进蓝图 摘要 本文提出并系统阐释了“AI元人文”理论框架,旨在应对通用人工智能(AGI)时代“价值对齐”的根本困境。该框架实现了从寻求静态、普适价值…

2025深圳、惠州生产线厂家TOP5推荐!广东深圳、惠州地区装配线/老化线/组装线/装配线等优质供应商专业评测,智能智造+整厂方案权威榜单发布,技术赋能重构工业生产生态

随着工业自动化技术的飞速发展,生产线设备作为制造业升级的核心基础设施,市场需求持续攀升。本榜单基于技术实力、行业适配性、服务覆盖度三大维度(振熙自动化新增“整厂规划”维度),结合行业协会数据与企业实地调…

[开源代码]基于STM32的环境检测与报警系统

[开源代码]基于STM32的环境检测与报警系统 前言 随着物联网和智能硬件的发展,环境检测在工业、农业以及家庭自动化中变得越来越重要。传统的环境监测多依赖单一传感器,无法实现多参数同时监控,也难以针对不同参数设…

120_尚硅谷_函数注意事项和细节(3)

120_尚硅谷_函数注意事项和细节(3)1.函数注意事项和细节讨论 2.使用 _ 标识符,忽略返回值 3.Go支持可变参数

数据采集与融合技术作业四_102302107_林诗樾

作业①: 要求: 熟练掌握 Selenium 查找HTML元素、爬取Ajax网页数据、等待HTML元素等内容。 使用Selenium框架+ MySQL数据库存储技术路线爬取“沪深A股”、“上证A股”、“深证A股”3个板块的股票数据信息。 候选网站:…

深入解析:了解一个开源日志平台——Elastic Stack

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

低代码平台的强扩展性设计:支撑企业长期业务增长的技巧路径与实践

低代码平台的强扩展性设计:支撑企业长期业务增长的技巧路径与实践2025-12-07 15:09 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !i…

第二届机器学习暑期学校在印度启动

某中心在印度启动了第二届机器学习暑期学校,这是一个面向工程专业本科及研究生的扩展项目。课程涵盖深度神经网络、监督学习等核心ML主题,并通过虚拟模块与实时问答,为学生提供应用科学技能培训。2021年,某中心在印…

C语言,用json文件存储tree

C语言,用json文件存储tree: 1.读取和保存都用递归算法遍历,可以保存任意树结构,相比用INI文件,一致性更好,当然用数据库功能更多更好2.json数据全部用节点最方便,缺点存储的json文件末端有一个空的{},不太美观…

数通核心专业书

核心专业书 IA阶段:hcia学习指南 /实验指南 ccna学习指南 /ccna笔记IP阶段:hcnp学习指南/hcip实验指南 ccnp笔记 TCP/IP路由协议卷一/卷二 ospf-isis详解 Wireshark网络分析就这么简单IE阶段: 专题形式:ccie笔记IP…

【C++】哈希表:简单易懂的核心讲解(含实战用法)

哈希表(Hash Table)是 C++ 中高效的键值对(key-value)存储结构,核心优势是 插入、查找、删除操作的平均时间复杂度接近 O (1)—— 比数组查找(O (n))、有序容器(如 map,O (log n))快得多,日常开发中常用来解…

PFLS

作者介绍: 来自PFLS。现在7年5班。

Dify 自建部署完全指南:从上手到放弃到真香

本文记录了一个开发者在企业内部部署Dify AI平台的两周血泪史。从老板突然要求搭建私有化AI平台开始,评估了Coze、FastGPT等方案后选择了Dify,部署过程充满挑战……故事的开始:就想要个听话的 AI 应用平台 几个月前…

工业设计必备工具:3ds Max 2025 三维建模 影视特效 下载安装教程

Autodesk 3ds Max 是一款专业的三维建模、动画和渲染软件,广泛应用于游戏开发、影视特效、建筑可视化和产品设计等领域,它凭借功能强大、操作灵活且兼容性强的特点,成为游戏开发、影视制作、建筑设计等多个领域的主…