Airflow量化入门系列:第四章 A股数据处理与存储优化
Airflow量化入门系列:第四章 A股数据处理与存储优化
本教程系统性地讲解了 Apache Airflow 在 A 股量化交易中的应用,覆盖从基础安装到高级功能的完整知识体系。通过八章内容,读者将掌握 Airflow 的核心概念、任务调度、数据处理、技术指标计算、策略回测及工作流监控、Docker/Kubernetes集成及生产环境优化等关键技能。教程整合 Tushare 数据源、TA-Lib 技术指标库和 VectorBT 策略回测工具,提供丰富实战案例,帮助构建高效、可靠的工作流,助力量化交易实践。
文中内容仅限技术学习与代码实践参考,市场存在不确定性,技术分析需谨慎验证,不构成任何投资建议。适合量化新手建立系统认知,为策略开发打下基础。
学习对象
- 中高级水平的开发者
- 具备 Python 编程基础,熟悉基本的 ETL 流程和数据分析工具
- 希望掌握 Airflow 在量化交易场景中的应用
教程目标
- 系统掌握 Apache Airflow 的核心功能与高级特性
- 深入理解 Airflow 在 A 股量化交易工作流中的应用
- 能够独立设计、部署和维护复杂的量化交易工作流
教程目录
第一章 Airflow基础与量化交易场景
1.1 Airflow 2.10+核心概念与架构
1.2 量化交易中的任务调度需求
1.3 Airflow环境搭建
1.4 DAG设计原则与任务依赖关系
1.5 示例:Tushare数据定时抓取与存储(Parquet格式)
第二章 DAG设计与任务流控制
2.1 DAG生命周期与状态管理
2.2 Operator类型详解(PythonOperator、BashOperator、TaskFlow API)
2.3 任务依赖关系与XCom通信机制
2.4 示例:A股数据预处理流水线(缺失值处理、特征工程)
2.5 错误处理与重试机制
第三章 定时调度与告警集成飞书
3.1 Cron表达式与调度策略
3.2 Airflow Scheduler工作原理
3.3 Airflow Web UI监控与日志分析
3.4 示例:A股日线数据定时更新与异常检测
3.5 告警机制与飞书集成
第四章 A股数据处理与存储优化
4.1 Parquet文件格式优化(分区、压缩)
4.2 Airflow与Tushare API交互最佳实践
4.3 数据管道性能优化(并行任务与资源管理)
4.4 示例:A股基本面数据ETL流程
4.5 数据版本控制与回滚策略
第五章 技术指标计算与特征工程
5.1 TA-Lib集成与自定义指标开发
5.2 并行计算与任务拆分策略
5.3 特征工程流水线设计(滞后特征、滚动窗口)
5.4 数据校验与一致性检查
5.5 示例:A股技术指标流水线(MACD、RSI、布林带)
第六章 VectorBT策略开发与回测
6.1 VectorBT集成与回测流程
6.2 策略参数优化与网格搜索
6.3 回测结果与性能评估
6.4 策略版本管理与持续迭代
6.5 示例:基于动量策略的A股回测
第七章 机器学习模型训练与部署
7.1 Airflow与Scikit-learn集成
7.2 模型训练流水线设计(数据分片、交叉验证)
7.3 模型评估与超参数调优
7.4 模型部署与在线预测
7.5 示例:A股收益率预测模型训练
第八章 高级特性与生产环境优化
8.1 动态任务生成与SubDAG
8.2 Airflow与Kubernetes集成
8.3 安全性与权限管理
8.4 生产环境部署与监控
9.5 性能优化与扩展性设计
第四章 A股数据处理与存储优化
4.1 Parquet文件格式优化(分区、压缩)
Parquet是一种高效的列式存储格式,特别适合处理大规模结构化数据。通过合理的分区策略和压缩算法选择,可以显著提升数据读写效率。
推荐阅读🚀:
- Pandas+PyArrow:股票数据存储 Parquet 入门指引 🔥
- A股数据存储实战:Parquet技术深度解析
关键知识点
- 分区存储:通过
partition_cols
参数按交易日期分区存储,路径结构为trade_date=YYYYMMDD
,减少查询时的I/O操作。 - 压缩算法:使用
snappy
压缩算法,平衡了压缩率和读写速度。 - 列式存储:Parquet的列式存储结构允许只读取需要的列,减少内存占用并提升查询效率。
示例:按交易日期分区存储A股日线数据
import osimport pendulum
import tushare as tsfrom airflow import DAG
from airflow.configuration import conf
from airflow.operators.python import PythonOperator# 配置 Tushare API
TS_TOKEN = conf.get("tushare", "api_token")
ts.set_token(TS_TOKEN)
pro = ts.pro_api()# 数据存储路径
DATA_DIR = conf.get("tushare", "data_folder")
os.makedirs(DATA_DIR, exist_ok=True)def optimized_data_storage(**kwargs):"""按日期分区存储A股日线数据。:param kwargs: Airflow任务上下文"""# 获取任务执行日期,格式为YYYYMMDDexecution_date = kwargs["execution_date"].strftime("%Y%m%d")# 定义股票代码列表(示例:沪深300成分股)stock_codes = ["600000.SH", "600036.SH", "000001.SZ"]start_date = execution_dateend_date = execution_date# 按日期分区存储,使用snappy压缩data_path = os.path.join(DATA_DIR, "kline")os.makedirs(data_path, exist_ok=True)contents = os.listdir(data_path)# 如果内容列表为空,则是首次抓取数据if len(contents) == 0:start_date = "20250101" # 默认开始日期try:# 抓取指定日期的A股日线数据df = pro.daily(ts_code=",".join(stock_codes),start_date=start_date,end_date=end_date,)df.to_parquet(data_path,index=False,compression="snappy",partition_cols=["trade_date"], # 按日期分区)print(f"Data saved to {data_path}")except Exception as e:print(f"Error fetching or writing data: {e}")# 定义DAG
with DAG("optimized_data_storage",description="按日期分区存储A股日线数据",schedule_interval="30 16 * * 1-5", # 工作日16:30执行start_date=pendulum.today().add(days=-1), # DAG开始日期tags=["quant", "storage"],
) as dag:# 定义任务optimize_task = PythonOperator(task_id="optimized_data_storage",python_callable=optimized_data_storage,provide_context=True,)# 设置任务依赖关系optimize_task
4.2 Airflow与Tushare API交互最佳实践
关键知识点
- 批量查询:通过批量查询减少API调用次数,提升效率。
- 错误处理:对每个股票的API调用添加异常处理,确保单个失败不会影响整体流程。
- 数据存储:使用Parquet格式存储数据,便于后续分析。
示例:批量抓取A股基本面数据
import os
from datetime import timedeltaimport pandas as pd
import pendulum
import tushare as tsfrom airflow import DAG
from airflow.configuration import conf
from airflow.operators.python import PythonOperator# 配置 Tushare API
TS_TOKEN = conf.get("tushare", "api_token")
ts.set_token(TS_TOKEN)
pro = ts.pro_api()# 数据存储路径
DATA_DIR = conf.get("tushare", "data_folder")
os.makedirs(DATA_DIR, exist_ok=True)def fetch_financial_data(**kwargs):"""批量抓取A股基本面数据并存储为Parquet文件。:param kwargs: Airflow任务上下文"""# 获取任务执行日期execution_date = kwargs["execution_date"].strftime("%Y%m%d")try:# 批量获取沪深股通成份股hs300_cons = pro.hs_const(hs_type="SH")stock_codes = hs300_cons["ts_code"].tolist()# 示例:只抓取前5只股票数据fetch_stock_codes = stock_codes[:5]# 批量查询基本面数据financial_data = []for code in fetch_stock_codes:try:df = pro.fina_indicator(ts_code=code,start_date="20240101", # 默认开始日期end_date=execution_date,)financial_data.append(df)except Exception as e:print(f"Error fetching data for {code}: {e}")# 合并数据并存储if financial_data:df = pd.concat(financial_data)file_path = os.path.join(DATA_DIR, "financial_data.parquet")df.to_parquet(file_path, index=False, compression="snappy")print(f"Financial data saved to {file_path}")except Exception as e:print(f"Error in financial data pipeline: {e}")# 定义DAG默认参数
default_args = {"owner": "airflow", # DAG所有者"depends_on_past": False, # 是否依赖过去任务"email_on_failure": False, # 任务失败时是否发送邮件"email_on_retry": False, # 任务重试时是否发送邮件"retries": 1, # 任务重试次数"retry_delay": timedelta(minutes=5), # 任务重试间隔
}# 定义DAG
with DAG("fetch_financial_data", # DAG名称description="批量抓取A股基本面数据", # DAG描述default_args=default_args, # 默认参数schedule_interval=timedelta(days=1), # 调度间隔(每天执行一次)start_date=pendulum.today().add(days=-1), # DAG开始日期tags=["quant", "tushare"], # DAG标签
) as dag:# 定义任务fetch_task = PythonOperator(task_id="fetch_financial_data", # 任务IDpython_callable=fetch_financial_data, # 任务执行函数provide_context=True, # 提供任务上下文)# 设置任务依赖关系fetch_task
4.3 数据管道性能优化(并行任务与资源管理)
在数据处理管道中,通过并行任务和资源管理可以显著提升性能。使用CeleryExecutor
可以实现任务的分布式处理。
关键知识点
- 并行任务:通过
CeleryExecutor
实现任务的分布式处理,提升并行效率。 - 资源管理:配置任务的CPU和内存资源,避免资源竞争。
- 任务队列:使用
Celery
和Redis
作为任务队列,确保任务的可靠执行。
CeleryExecutor配置
-
配置CeleryExecutor
修改
airflow.cfg
文件,添加以下配置:[core] executor = CeleryExecutor[celery] broker_url = redis://localhost:6379/0 result_backend = db+postgresql://user:password@localhost:5432/airflow worker_concurrency = 4 # 根据实际情况调整并发数
-
启动Celery Worker
airflow celery worker
4.4 A股基本面数据ETL流程
ETL(Extract, Transform, Load)是数据处理的核心流程。通过优化ETL流程,可以提升数据处理效率。
关键知识点
- 数据抽取:批量获取沪深300成分股的基本面数据。
- 数据转换:清洗数据并计算特征。
- 数据加载:将处理后的数据存储为Parquet文件。
4.5 数据版本控制与回滚策略
在量化交易中,数据版本控制和回滚策略是确保数据一致性和稳定性的关键。
关键知识点
- 数据版本控制:通过Git管理数据集的版本,每次数据更新生成一个新的提交。
- 回滚策略:使用Git回滚到上一个版本,确保数据一致性。
- 数据一致性检查:通过校验和或哈希值确保数据完整性。
数据版本控制与回滚
import os
from datetime import timedeltaimport pandas as pd
import pendulum
import tushare as tsfrom airflow import DAG
from airflow.configuration import conf
from airflow.operators.python import BranchPythonOperator, PythonOperator# 配置 Tushare API
TS_TOKEN = conf.get("tushare", "api_token")
ts.set_token(TS_TOKEN)
pro = ts.pro_api()# 数据存储路径
DATA_DIR = conf.get("tushare", "data_folder")
os.makedirs(DATA_DIR, exist_ok=True)def fetch_financial_data(**kwargs):"""批量抓取A股基本面数据并存储为Parquet文件。:param kwargs: Airflow任务上下文"""# 获取任务执行日期作为版本号execution_date = kwargs["execution_date"].strftime("%Y%m%d")try:# 批量获取沪深股通成份股hs300_cons = pro.hs_const(hs_type="SH")stock_codes = hs300_cons["ts_code"].tolist()# 示例:只抓取前5只股票数据fetch_stock_codes = stock_codes[:5]# 批量查询基本面数据financial_data = []for code in fetch_stock_codes:try:df = pro.fina_indicator(ts_code=code,start_date="20240101", # 默认开始日期end_date=execution_date,)financial_data.append(df)except Exception as e:print(f"Error fetching data for {code}: {e}")# 合并数据并存储if financial_data:df = pd.concat(financial_data)file_path = os.path.join(DATA_DIR, "financial_data.parquet")df.to_parquet(file_path, index=False, compression="snappy")print(f"Financial data saved to {file_path}")return "success"except Exception as e:print(f"Error in financial data pipeline: {e}")return "failure"def git_commit_and_push(**kwargs):"""提交数据到Git并推送到远程仓库。:param kwargs: Airflow任务上下文"""try:# 获取任务执行日期作为提交信息commit_msg = kwargs["execution_date"].strftime("%Y%m%d")# 提交到Gitos.system(f"git add {DATA_DIR}/financial_data_v{commit_msg}.parquet")os.system(f'git commit -m "Update data for {commit_msg}"')os.system("git push origin main")print("Data committed and pushed to Git")except Exception as e:print(f"Error in Git operations: {e}")def git_rollback(**kwargs):"""回滚到指定版本。:param kwargs: Airflow任务上下文"""try:# 获取上一个版本的提交哈希previous_commit = (os.popen("git log -n 1 --skip 1 --pretty=format:%H").read().strip())# 回滚到上一个版本os.system(f"git reset --hard {previous_commit}")print(f"Rolled back to commit {previous_commit}")except Exception as e:print(f"Error in rollback: {e}")def decide_next_task(ti):"""根据fetch_financial_data的结果决定下一步执行哪个任务。:param ti: TaskInstance对象"""result = ti.xcom_pull(task_ids="fetch_financial_data")if result == "success":return "git_commit_and_push"else:return "git_rollback"# 定义DAG默认参数
default_args = {"owner": "airflow", # DAG所有者"depends_on_past": False, # 是否依赖过去任务"email_on_failure": False, # 任务失败时是否发送邮件"email_on_retry": False, # 任务重试时是否发送邮件"retries": 1, # 任务重试次数"retry_delay": timedelta(minutes=5), # 任务重试间隔
}# 定义DAG
with DAG("data_version_control",description="数据版本控制与回滚",default_args=default_args, # 默认参数schedule_interval=timedelta(days=1), # 调度间隔(每天执行一次)start_date=pendulum.today().add(days=-1), # DAG开始日期tags=["quant", "version"],
) as dag:# 定义任务fetch_task = PythonOperator(task_id="fetch_financial_data",python_callable=fetch_financial_data,provide_context=True,)commit_task = PythonOperator(task_id="git_commit_and_push",python_callable=git_commit_and_push,provide_context=True,)rollback_task = PythonOperator(task_id="git_rollback",python_callable=git_rollback,provide_context=True,)decide_task = BranchPythonOperator(task_id="decide_next_task",python_callable=decide_next_task,provide_context=True,)# 设置任务依赖关系fetch_task >> decide_taskdecide_task >> [commit_task, rollback_task]
风险提示与免责声明
本文内容基于公开信息研究整理,不构成任何形式的投资建议。历史表现不应作为未来收益保证,市场存在不可预见的波动风险。投资者需结合自身财务状况及风险承受能力独立决策,并自行承担交易结果。作者及发布方不对任何依据本文操作导致的损失承担法律责任。市场有风险,投资须谨慎。
相关文章:
Airflow量化入门系列:第四章 A股数据处理与存储优化
Airflow量化入门系列:第四章 A股数据处理与存储优化 本教程系统性地讲解了 Apache Airflow 在 A 股量化交易中的应用,覆盖从基础安装到高级功能的完整知识体系。通过八章内容,读者将掌握 Airflow 的核心概念、任务调度、数据处理、技术指标计…...
《海空重力测量理论方法及应用》之一重力仪系统组成及工作原理(下)
2、三轴稳定平台型 稳定平台的作用是隔离测量载体角运动对重力观测量的影响,确保重力传感器的敏感轴方向始终与重向保持一致。 当前主流的海空重力仪使用的稳定平台方案主要有4种: ①双轴阻尼陀螺平台: ②)双轴惯导加捷联方位平台: ③三轴惯导平台; ④捷联惯导…...
C++模板递归结构详解和使用
示例代码 template<typename _SourceIterator, typename _DestT> struct convert_pointer {typedef typename convert_pointer<typename _SourceIterator::pointer, _DestT>::type type; };1. 模板参数 _SourceIterator 是输入的类型,通常表示迭代器类…...
(八)PMSM驱动控制学习---无感控制之滑膜观测器
在FOC矢量控制中,我们需要实时得到转子的转速和位置 ,但在考虑到成本和使用场合的情况下,往往使用无感控制,因为无位置传感器克服了传统机械式传感器的很多缺点和不足。比如,机械式传感器对环境要求比较严格࿰…...
蓝桥杯真题-分糖果-题解
链接:https://www.lanqiao.cn/problems/4124/learning/ 题目 复述:两种糖果,分别有9和16,分给7人,每个人得到的最少2,最多5,必需全部分完,几种分法? 复习-深度优先搜索 …...
推荐系统(二十二):基于MaskNet和WideDeep的商品推荐CTR模型实现
在上一篇文章《推荐系统(二十一):基于MaskNet的商品推荐CTR模型实现》中,笔者基于 MaskNet 构建了一个简单的模型。笔者所经历的工业级实践证明,将 MaskNet 和 Wide&Deep 结合应用,可以取得不错的效果&…...
辅助查询是根据查询到的文档片段再去生成新的查询问题
💡 辅助查询是怎么来的? 它是基于你当前查询(query)检索到的某个文档片段(chunk_result),再去“反推”出新的相关问题(utility queries),这些问题的作用是&a…...
Spring Cloud 框架为什么能处理高并发
Spring Cloud框架能够有效处理高并发场景,核心在于其微服务架构设计及多组件的协同作用,具体机制如下: 一、分布式架构设计支撑高扩展性 服务拆分与集群部署 Spring Cloud通过微服务拆分将单体系统解耦为独立子服务,每个服务可独…...
Pseduo LiDAR(CVPR2019)
文章目录 AbstractIntroductionRelated WorkLiDAR-based 3D object detectionStereo- and monocular-based depth estimationImage-based 3D object detection MethodDepth estimationPseudo-LiDAR generationLiDAR vs. pseudo-LiDAR3D object detectionData representation ma…...
强化学习课程:stanford_cs234 学习笔记(3)introduction to RL
文章目录 前言7 markov 实践7.1 markov 过程再叙7.2 markov 奖励过程 MRP(markov reward process)7.3 markov 价值函数与贝尔曼方程7.4 markov 决策过程MDP(markov decision process)的 状态价值函数7.4.1 状态价值函数7.4.2 状态…...
前端精度计算:Decimal.js 基本用法与详解
一、Decimal.js 简介 decimal.js 是一个用于任意精度算术运算的 JavaScript 库,它可以完美解决浮点数计算中的精度丢失问题。 官方API文档:Decimal.js 特性: 任意精度计算:支持大数、小数的高精度运算。 链式调用:…...
来聊聊C++中的vector
一.vector简介 vector是什么 C 中的 vector 是一种序列容器,它允许你在运行时动态地插入和删除元素。 vector 是基于数组的数据结构,但它可以自动管理内存,这意味着你不需要手动分配和释放内存。 与 C 数组相比,vector 具有更多的…...
对比学习中的NCE(Noise-Contrastive Estimation)和InfoNCE(SimCLR)损失函数+案例(附SimSiam分析)
在对比学习(Contrastive Learning)中,NCE(Noise-Contrastive Estimation)和InfoNCE是两种常见的目标函数,它们都用于通过区分正样本和负样本来学习高质量的表示。 1. NCE(Noise-Contrastive Est…...
基于FAN网络的图像识别系统设计与实现
基于FAN网络的图像识别系统设计与实现 一、系统概述 本系统旨在利用FAN(Fourier Analysis Networks)网络架构实现高效的图像识别功能,并通过Python语言设计一个直观的用户界面,方便用户操作与使用。FAN网络在处理周期性特征方面具有独特优势,有望提升图像识别在复杂场景…...
【瑞萨 RA-Eco-RA2E1-48PIN-V1.0 开发板测评】PWM
【瑞萨 RA-Eco-RA2E1-48PIN-V1.0 开发板测评】PWM 本文介绍了瑞萨 RA2E1 开发板使用内置时钟和定时器实现 PWM 输出以及呼吸灯的项目设计。 项目介绍 介绍了 PWM 和 RA2E1 的 PWM 资源。 PWM 脉冲宽度调制(Pulse Width Modulation, PWM)是一种对模拟…...
NDK开发:开发环境
NDK开发环境 一、NDK简介 1.1 什么是NDK NDK(Native Development Kit)是Android提供的一套工具集,允许开发者在Android应用中使用C/C++代码。它包含了: 交叉编译器构建工具调试器系统头文件和库示例代码和文档1.2 NDK的优势 性能优化:直接使用底层代码,提高性能代码保…...
设计模式简述(三)工厂模式
工厂模式 描述简单工厂(静态工厂)工厂方法模式 抽象工厂增加工厂管理类使用 描述 工厂模式用以封装复杂的实例初始化过程,供外部统一调用 简单工厂(静态工厂) 如果对象创建逻辑简单且一致,可以使用简单工…...
通过Postman和OAuth 2.0连接Dynamics 365 Online的详细步骤
🌟 引言 在企业应用开发中,Dynamics 365 Online作为微软的核心CRM平台,提供了强大的Web API接口。本文将教你如何通过Postman和OAuth 2.0认证实现与Dynamics 365的安全连接,轻松调用数据接口。 📝 准备工作 工具安装…...
LlamaIndex实现RAG增强:上下文增强检索/重排序
面向文档检索的上下文增强技术 文章目录 面向文档检索的上下文增强技术概述技术背景核心组件方法详解文档预处理向量存储创建上下文增强检索检索对比技术优势结论导入库和环境变量读取文档创建向量存储和检索器数据摄取管道使用句子分割器的摄取管道使用句子窗口的摄取管道查询…...
AI比人脑更强,因为被植入思维模型【43】蝴蝶效应思维模型
giszz的理解:蝴蝶效应我们都熟知,就是说一个微小的变化,能带动整个系统甚至系统的空间和时间的远端,产生巨大的链式反应。我学习后的启迪,简单的说,就是不要忽视任何微小的问题,更多时候&#x…...
程序化广告行业(62/89):DSP系统的媒体与PDB投放设置探秘
程序化广告行业(62/89):DSP系统的媒体与PDB投放设置探秘 大家好!在之前的学习中,我们对程序化广告的DSP系统有了一定了解。今天还是带着和大家共同进步的想法,深入探索DSP系统中媒体设置以及PDB投放设置的…...
Java项目之基于ssm的怀旧唱片售卖系统(源码+文档)
项目简介 怀旧唱片售卖系统实现了以下功能: 用户信息管理: 用户信息新增:添加新用户的信息。 用户信息修改:对现有用户信息进行修改。 商品信息管理: 商品信息添加:增加新的商品(唱片&#x…...
程序化广告行业(61/89):DSP系统活动设置深度剖析
程序化广告行业(61/89):DSP系统活动设置深度剖析 大家好!在程序化广告的学习道路上,我们已经探索了不少重要内容。今天依旧本着和大家一起学习进步的想法,深入解析DSP系统中活动设置的相关知识。这部分内容…...
Altshuller矛盾矩阵查询:基于python和streamlit
基于python和streamlit实现的Altshuller矛盾矩阵查询 import streamlit as st import json# 加载数据 st.cache_resource def load_data():with open(parameter.json, encodingutf-8) as f:parameters json.load(f)with open(way.json, encodingutf-8) as f:contradictions …...
FreeRTOS的空闲任务
在 FreeRTOS 中,空闲任务(Idle Task) 是操作系统自动创建的一个特殊任务,其作用和管理方式如下: 1. 空闲任务创建 FreeRTOS 内核自动创建:当调用 vTaskStartScheduler() 启动调度器时,内核会自…...
【代码模板】如何用FILE操作符打开文件?fopen、fclose
#include "stdio.h" #include "unistd.h"int main(int argc, char *argv[]) {FILE *fp fopen("1.log", "wb");if (!fp) {perror("Failed open 1.log");return -1;}fclose(fp); }关于权限部分参考兄弟篇【代码模板】C语言中…...
[特殊字符] Pandas 常用操作对比:Python 运算符 vs Pandas 函数
在 Pandas 中,许多操作可以直接使用 Python 的比较运算符(如 、!、>、< 等),而不需要调用 Pandas 的专门函数(如 eq()、ne()、gt() 等)。这些运算符在 Pandas 中已经被重载,代码更简洁。以…...
I.MX6ULL开发板与linux互传文件的方法--NFS,SCP,mount
1、内存卡或者U盘 方法比较简单,首先在linux系统中找到u盘对应的文件夹,随后使用cp指令将文件拷贝进u盘。 随后将u盘插入开发板中,找到u盘对应的设备文件。一般u盘对应的设备文件在/dev下,以sda开头,可以使用命令列出所…...
图解AUTOSAR_SWS_FlashEEPROMEmulation
AUTOSAR Flash EEPROM Emulation (FEE) 详解 基于AUTOSAR规范的Flash EEPROM Emulation模块分析 目录 1. 概述2. 架构设计 2.1 模块位置与接口2.2 内部状态管理2.3 配置结构3. API接口 3.1 接口功能分类3.2 错误管理4. 操作流程 4.1 写入操作序列5. 总结1. 概述 Flash EEPROM …...
Unity:Simple Follow Camera(简单相机跟随)
为什么需要Simple Follow Camera? 在游戏开发中,相机(Camera)是玩家的“眼睛”。它的作用是决定玩家看到游戏世界的哪一部分。很多游戏需要相机自动跟随玩家角色,让玩家始终可以看到角色及其周围的环境,而…...
[项目总结] 在线OJ刷题系统项目总结与分析(二): 技术应用(上)
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…...
针对Ansible执行脚本时报错“可执行文件格式错误”,以下是详细的解决步骤和示例
针对Ansible执行脚本时报错“可执行文件格式错误”,以下是详细的解决步骤和示例: 目录 一、错误原因分析二、解决方案1. 检查并添加可执行权限2. 修复Shebang行3. 转换文件格式(Windows → Unix)4. 检查脚本内容兼容性5. 显式指定…...
从 Dense LLM 到 MoE LLM:以 DeepSeek MoE 为例讲解 MoE 的基本原理
写在前面 大多数 LLM 均采用 Dense(密集) 架构。这意味着,在处理每一个输入 Token 时,模型所有的参数都会被激活和计算。想象一下,为了回答一个简单的问题,你需要阅读整部大英百科全书的每一个字——这显然效率低下。 为了突破 Dense 模型的瓶颈,一种名为 Mixture of …...
未来已来:探索AI驱动的HMI设计新方向
在科技浪潮的持续冲击下,人工智能(AI)正以势不可挡的姿态重塑各个领域的格局,其中人机交互(HMI,Human - Machine Interaction)设计领域深受其影响,正经历着深刻的变革。AI 技术的融入…...
5天速成ai agent智能体camel-ai之第1天:camel-ai安装和智能体交流消息讲解(附源码,零基础可学习运行)
嗨,朋友们!👋 是不是感觉AI浪潮铺天盖地,身边的人都在谈论AI Agent、大模型,而你看着那些密密麻麻的代码,感觉像在读天书?🤯 别焦虑!你不是一个人。很多人都想抓住AI的风…...
Unity UGUI使用手册
概述 UGUI(Unity Graphical User Interface) :Unity 图像用户界面 在游戏开发中,我们经常需要搭建一些图形用户界面。Unity内置的UGUI可以帮助开发者可视化地拼接界面,提高开发效率。UGUI提供不同样式的UI组件,并且封装了对应功能的API&am…...
(二)输入输出处理——打造智能对话的灵魂
上一篇:(一)从零开始:用 LangChain 和 ZhipuAI 搭建简单对话 在上一篇文章中,我们成功搭建了一个基于 LangChain 和 ZhipuAI 的智能对话系统的基础环境。今天,我们将深入探讨输入输出处理的细节࿰…...
beego文件上传
1file.go 2html代码 3路由设置 beego.Router("/file/Upload", &controllers.FileUploadController{}, "post:Upload") 注意 1,得新建个upload文件夹 2,路由设置严格区分大小写。 biiego文件下载上传代码 github 觉得不错Star下...
代码随想录回溯算法01(递归)
回溯法也可以叫做回溯搜索法,它是一种搜索的方式。 回溯是递归的副产品,只要有递归就会有回溯。 所以以下讲解中,回溯函数也就是递归函数,指的都是一个函数。 组合问题:N个数里面按一定规则找出k个数的集合切割问题&am…...
分治-归并排序-逆序对问题
目录 1.升序(以右边的合并组为基准) 2.降序(以左边的合并组为基准) 3.逆对序--固定下标 1.升序(以右边的合并组为基准) 找出左边有多少个数比我(nums[right])大 应该在每一次合并之前,进行…...
mysql-getshell的几种方法
mysql_getshell的几种方法 mysql_getshell 一、mysql的–os-shell 利用原理 –os-shell就是使用udf提权获取WebShell。也是通过into oufile向服务器写入两个文件,一个可以直接执行系统命令,一个进行上传文件。此为sqlmap的一个命令,利用这…...
初阶数据结构--树
1. 树的概念与结构 树是⼀种⾮线性的数据结构,它是由 n(n>0) 个有限结点组成⼀个具有层次关系的集合。把它叫做 树是因为它看起来像⼀棵倒挂的树,也就是说它是根朝上,⽽叶朝下的。 有⼀个特殊的结点,称…...
搭建redis主从同步实现读写分离(原理剖析)
搭建redis主从同步实现读写分离(原理剖析) 文章目录 搭建redis主从同步实现读写分离(原理剖析)前言一、搭建主从同步二、同步原理 前言 为什么要学习redis主从同步,实现读写分析。因为单机的redis虽然是基于内存,单机并发已经能支撑很高。但是随着业务量…...
Python3 学习笔记
Python3 简介 | 菜鸟教程 一 Python3 简介 Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色…...
kmpmanacher
KMP 理论 KMP算法的核心是构建一个部分匹配表,也称为前缀表。这个表记录了模式串中每个位置之前的最长公共前缀和后缀的长度。例如,对于模式串"ababaca",其部分匹配表如下: 位置0123456字符ababaca最长公共前后缀长度…...
ts基础知识总结
TypeScript(简称TS)是JavaScript(简称JS)的一个超集,它在JS的基础上增加了静态类型检查、类、模块等特性。 TypeScript 与 JavaScript 的不同及好处 不同点 类型系统 JavaScript 是一种弱类型语言,这意味…...
操作系统内存管理
为什么要有虚拟内存 单片机的CPU直接操作内存的物理地址,这就导致在内存中同时运行两个程序是不可能的,有可能会出现第一个程序在2000的位置写入新的值将会擦掉第二个程序存放在相同位置上的内容。 出现这个问题的根本原因是两个程序引用了绝对物理地址。…...
M芯片,能运行普通应用程序的原架构虚拟机
在我们使用搭载了Apple芯片的Mac时,很多时候会用到windows虚拟机来使用windows应用程序 但是Apple芯片是ARM架构,如果运行原价构的虚拟机,很多64位的普通应用程序就无法运行,如果使用UTM来安装64位的跨架构虚拟机,就会非常卡慢 但实际上使用一种特殊的系统镜像,就可以使用ARM…...
多功能指示牌的主要功能有哪些?
哇哦!咱们的多功能指示牌可有着超多超厉害的主要功能哦,简直就是生活中的超级小助手,涵盖了方方面面呢! 指示导向功能 道路指引:不管是在繁华热闹的城市道路,还是车水马龙的高速公路,亦或是风…...
Superset 问题
和nginx结合使用,如果不是配置到根路径,会比较麻烦,我试了很多种方法,也就 这个 靠谱点,不过,我最后还是选择的部署在根路径,先探索一番再说默认不能选择mysql数据库,需要安装mysql客…...