分析大数据领域ClickHouse的备份与恢复策略

news2026/3/22 8:30:39
分析大数据领域ClickHouse的备份与恢复策略关键词大数据、ClickHouse、备份策略、恢复策略、数据安全摘要本文深入探讨了大数据领域中ClickHouse的备份与恢复策略。我们将先介绍ClickHouse以及备份恢复的重要性接着解释备份与恢复的核心概念然后阐述具体的备份与恢复算法原理和操作步骤还会给出实际的项目案例。同时分析ClickHouse备份与恢复在不同场景下的应用推荐相关工具和资源最后探讨其未来发展趋势与挑战帮助读者全面了解并掌握ClickHouse的备份与恢复策略。背景介绍目的和范围我们的目的是详细分析ClickHouse这个大数据领域常用数据库的备份与恢复策略。范围涵盖了备份与恢复的基本概念、具体的操作方法、在实际项目中的应用以及未来的发展方向等方面。通过这篇文章希望能让大家清楚地知道如何给ClickHouse的数据做好备份并且在需要的时候能够顺利恢复数据。预期读者这篇文章主要是为那些对大数据感兴趣尤其是使用ClickHouse进行数据存储和管理的开发者、运维人员准备的。当然如果你是一个对数据库备份恢复有学习需求的新手也能从这里学到很多有用的知识。文档结构概述接下来我们会先解释备份与恢复的核心概念然后介绍具体的算法原理和操作步骤再通过实际的项目案例来加深理解。之后会分析它的应用场景推荐相关工具和资源探讨未来的发展趋势和挑战。最后进行总结还会提出一些思考题让大家进一步思考。术语表核心术语定义ClickHouse它是一个用于联机分析处理OLAP的列式数据库管理系统就像一个超级大的仓库专门用来存放和快速处理大量的数据。备份就是把数据库里的数据复制一份存到另外一个地方就像我们把重要的文件复制一份放到移动硬盘里一样以防原来的数据丢失。恢复当原来的数据丢失或者损坏时把之前备份的数据拿出来重新放回数据库里让数据库恢复到原来的状态。相关概念解释全量备份就是把数据库里的所有数据都复制一份进行备份就像把整个仓库里的东西都搬到另一个仓库一样。增量备份只备份自上次备份以来发生变化的数据就好比只把仓库里新进来或者被挪动过的东西搬到另一个仓库。缩略词列表OLAP联机分析处理Online Analytical Processing简单来说就是对大量数据进行快速分析和查询的一种技术。核心概念与联系故事引入想象一下有一个超级大的图书馆里面存放着各种各样的书籍这些书籍就像是ClickHouse数据库里的数据。有一天图书馆突然发生了火灾很多书籍都被烧毁了。如果图书馆之前有把所有书籍都复印了一份存放在另一个地方那么就可以把复印的书籍拿出来重新摆放到图书馆里让图书馆恢复到原来的样子。这就是数据库备份与恢复的基本道理。核心概念解释像给小学生讲故事一样核心概念一备份备份就像我们出门旅行时会把重要的东西多带一份放在行李箱里。在数据库里就是把数据复制一份存到其他地方。比如我们在玩游戏的时候会时不时地保存一下游戏进度这样即使电脑突然死机了我们也能从保存的进度继续玩下去。数据库备份也是为了防止数据丢失比如遇到硬盘损坏、软件故障或者人为误操作等情况。核心概念二恢复恢复就像是我们不小心把拼图弄乱了然后按照原来的样子重新把拼图拼好。在数据库里当数据丢失或者损坏时我们就把之前备份的数据拿出来重新放到数据库里让数据库回到正常的状态。就像我们把旅行时备份的东西拿出来用一样在需要的时候备份的数据就能派上用场。核心概念三全量备份和增量备份全量备份就像我们把整个房间里的东西都搬到另一个房间不管东西有没有变化。而增量备份就像是只把房间里新进来或者被挪动过的东西搬到另一个房间。全量备份比较全面但是花费的时间和存储空间比较多增量备份比较节省时间和空间但是恢复的时候可能会稍微麻烦一些。核心概念之间的关系用小学生能理解的比喻备份和恢复的关系备份和恢复就像一对好朋友备份是为了恢复做准备的。就像我们准备应急包是为了在遇到紧急情况时使用一样备份数据是为了在数据丢失或者损坏时能够进行恢复。没有备份就没办法进行恢复而不进行恢复备份也就失去了意义。全量备份和增量备份的关系全量备份和增量备份是备份的两种不同方式它们就像两条不同的路都能到达备份数据的目的地。全量备份比较简单直接但是可能会浪费一些资源增量备份比较灵活能够节省资源但是需要更复杂的管理。在实际应用中我们可以根据不同的情况选择合适的备份方式。核心概念原理和架构的文本示意图备份与恢复的核心原理就是把数据从数据库复制到备份存储介质如磁盘、磁带等在需要恢复时再把备份的数据从存储介质复制回数据库。架构上一般包括数据库服务器、备份服务器和存储介质。数据库服务器负责存储和管理数据备份服务器负责执行备份和恢复操作存储介质则用于存放备份数据。Mermaid 流程图数据库备份操作备份存储介质需要恢复数据恢复操作从备份存储介质获取数据核心算法原理 具体操作步骤全量备份算法原理及操作步骤算法原理全量备份就是把数据库里的所有数据文件和元数据文件都复制一份。在ClickHouse中数据文件通常存放在特定的目录下元数据文件记录了数据库的结构信息。备份过程就是将这些文件完整地复制到备份存储介质上。Python 代码示例importshutilimportos# ClickHouse数据目录clickhouse_data_dir/var/lib/clickhouse/data# 备份目录backup_dir/backup/clickhouse_full_backup# 创建备份目录ifnotos.path.exists(backup_dir):os.makedirs(backup_dir)# 复制数据目录到备份目录shutil.copytree(clickhouse_data_dir,backup_dir)print(全量备份完成)增量备份算法原理及操作步骤算法原理增量备份需要记录每次备份的时间点在进行下一次备份时只备份自上次备份以来发生变化的数据文件。ClickHouse可以通过比较文件的修改时间来确定哪些数据发生了变化。Python 代码示例importshutilimportosimporttime# ClickHouse数据目录clickhouse_data_dir/var/lib/clickhouse/data# 备份目录backup_dir/backup/clickhouse_incremental_backup# 上次备份时间文件last_backup_time_file/backup/last_backup_time.txt# 获取上次备份时间ifos.path.exists(last_backup_time_file):withopen(last_backup_time_file,r)asf:last_backup_timefloat(f.read())else:last_backup_time0# 创建备份目录ifnotos.path.exists(backup_dir):os.makedirs(backup_dir)# 遍历数据目录forroot,dirs,filesinos.walk(clickhouse_data_dir):forfileinfiles:file_pathos.path.join(root,file)# 获取文件修改时间file_mtimeos.path.getmtime(file_path)iffile_mtimelast_backup_time:# 复制修改过的文件到备份目录relative_pathos.path.relpath(file_path,clickhouse_data_dir)backup_file_pathos.path.join(backup_dir,relative_path)backup_file_diros.path.dirname(backup_file_path)ifnotos.path.exists(backup_file_dir):os.makedirs(backup_file_dir)shutil.copy2(file_path,backup_file_path)# 更新上次备份时间withopen(last_backup_time_file,w)asf:f.write(str(time.time()))print(增量备份完成)恢复操作步骤全量恢复全量恢复就是把全量备份的数据文件和元数据文件覆盖到原来的数据库目录。importshutilimportos# 全量备份目录full_backup_dir/backup/clickhouse_full_backup# ClickHouse数据目录clickhouse_data_dir/var/lib/clickhouse/data# 停止ClickHouse服务os.system(systemctl stop clickhouse-server)# 删除原来的数据目录ifos.path.exists(clickhouse_data_dir):shutil.rmtree(clickhouse_data_dir)# 复制备份数据到数据目录shutil.copytree(full_backup_dir,clickhouse_data_dir)# 启动ClickHouse服务os.system(systemctl start clickhouse-server)print(全量恢复完成)增量恢复增量恢复需要先进行全量恢复然后再把增量备份的数据文件覆盖到相应的位置。importshutilimportos# 全量备份目录full_backup_dir/backup/clickhouse_full_backup# 增量备份目录incremental_backup_dir/backup/clickhouse_incremental_backup# ClickHouse数据目录clickhouse_data_dir/var/lib/clickhouse/data# 停止ClickHouse服务os.system(systemctl stop clickhouse-server)# 删除原来的数据目录ifos.path.exists(clickhouse_data_dir):shutil.rmtree(clickhouse_data_dir)# 复制全量备份数据到数据目录shutil.copytree(full_backup_dir,clickhouse_data_dir)# 遍历增量备份目录forroot,dirs,filesinos.walk(incremental_backup_dir):forfileinfiles:file_pathos.path.join(root,file)relative_pathos.path.relpath(file_path,incremental_backup_dir)target_pathos.path.join(clickhouse_data_dir,relative_path)target_diros.path.dirname(target_path)ifnotos.path.exists(target_dir):os.makedirs(target_dir)shutil.copy2(file_path,target_path)# 启动ClickHouse服务os.system(systemctl start clickhouse-server)print(增量恢复完成)数学模型和公式 详细讲解 举例说明备份时间复杂度分析假设数据库中有nnn个数据文件全量备份需要遍历所有的数据文件因此时间复杂度为O(n)O(n)O(n)。增量备份只需要遍历自上次备份以来发生变化的数据文件假设变化的数据文件数量为mmm则时间复杂度为O(m)O(m)O(m)通常m≤nm \leq nm≤n。存储空间分析全量备份需要存储所有的数据文件假设每个数据文件的平均大小为sss则全量备份所需的存储空间为Sfulln×sS_{full} n \times sSfull​n×s。增量备份只需要存储变化的数据文件所需的存储空间为Sincrementalm×sS_{incremental} m \times sSincremental​m×s。举例说明假设数据库中有 1000 个数据文件每个数据文件的平均大小为 1MB。如果进行全量备份需要的存储空间为1000×1MB1000MB1GB1000 \times 1MB 1000MB 1GB1000×1MB1000MB1GB。如果在两次备份之间只有 100 个数据文件发生了变化进行增量备份时需要的存储空间为100×1MB100MB100 \times 1MB 100MB100×1MB100MB。项目实战代码实际案例和详细解释说明开发环境搭建安装ClickHouse可以通过官方提供的安装包或者包管理工具进行安装。例如在Ubuntu系统上可以使用以下命令安装sudoapt-getinstallclickhouse-server clickhouse-client启动ClickHouse服务sudosystemctl start clickhouse-server源代码详细实现和代码解读我们已经在前面给出了全量备份、增量备份和恢复的Python代码示例。下面对代码进行详细解读。全量备份代码解读importshutilimportos# ClickHouse数据目录clickhouse_data_dir/var/lib/clickhouse/data# 备份目录backup_dir/backup/clickhouse_full_backup# 创建备份目录ifnotos.path.exists(backup_dir):os.makedirs(backup_dir)# 复制数据目录到备份目录shutil.copytree(clickhouse_data_dir,backup_dir)print(全量备份完成)这段代码首先导入了shutil和os模块用于文件操作。然后定义了ClickHouse数据目录和备份目录。接着检查备份目录是否存在如果不存在则创建。最后使用shutil.copytree函数将ClickHouse数据目录复制到备份目录。增量备份代码解读importshutilimportosimporttime# ClickHouse数据目录clickhouse_data_dir/var/lib/clickhouse/data# 备份目录backup_dir/backup/clickhouse_incremental_backup# 上次备份时间文件last_backup_time_file/backup/last_backup_time.txt# 获取上次备份时间ifos.path.exists(last_backup_time_file):withopen(last_backup_time_file,r)asf:last_backup_timefloat(f.read())else:last_backup_time0# 创建备份目录ifnotos.path.exists(backup_dir):os.makedirs(backup_dir)# 遍历数据目录forroot,dirs,filesinos.walk(clickhouse_data_dir):forfileinfiles:file_pathos.path.join(root,file)# 获取文件修改时间file_mtimeos.path.getmtime(file_path)iffile_mtimelast_backup_time:# 复制修改过的文件到备份目录relative_pathos.path.relpath(file_path,clickhouse_data_dir)backup_file_pathos.path.join(backup_dir,relative_path)backup_file_diros.path.dirname(backup_file_path)ifnotos.path.exists(backup_file_dir):os.makedirs(backup_file_dir)shutil.copy2(file_path,backup_file_path)# 更新上次备份时间withopen(last_backup_time_file,w)asf:f.write(str(time.time()))print(增量备份完成)这段代码首先导入了shutil、os和time模块。然后定义了ClickHouse数据目录、备份目录和上次备份时间文件。接着获取上次备份时间如果文件不存在则将上次备份时间设为 0。之后创建备份目录遍历数据目录检查每个文件的修改时间如果修改时间大于上次备份时间则将文件复制到备份目录。最后更新上次备份时间。恢复代码解读全量恢复和增量恢复的代码主要是先停止ClickHouse服务然后将备份数据复制到ClickHouse数据目录最后启动ClickHouse服务。具体代码已经在前面给出这里不再赘述。代码解读与分析通过这些代码我们可以实现ClickHouse的全量备份、增量备份和恢复操作。全量备份比较简单直接但是会占用较多的存储空间和时间增量备份可以节省存储空间和时间但是需要记录上次备份时间并且恢复时需要先进行全量恢复。在实际应用中我们可以根据数据的变化频率和重要性选择合适的备份策略。实际应用场景数据中心在数据中心中ClickHouse通常用于存储和处理大量的业务数据。为了保证数据的安全性和可用性需要定期进行备份。可以采用全量备份和增量备份相结合的方式例如每周进行一次全量备份每天进行一次增量备份。当遇到硬件故障或者软件故障时可以及时进行恢复减少数据丢失和业务中断的时间。互联网公司互联网公司通常会收集大量的用户行为数据使用ClickHouse进行数据分析。为了防止数据丢失需要对数据进行备份。可以根据数据的重要性和变化频率选择合适的备份策略。例如对于核心业务数据可以采用更频繁的备份方式如每天进行全量备份和每小时进行增量备份。科研机构科研机构在进行数据分析和实验时会使用ClickHouse存储大量的实验数据。为了保证实验数据的完整性和可重复性需要对数据进行备份。可以在每次实验结束后进行全量备份以便在需要时可以重新进行实验。工具和资源推荐备份工具ClickHouse官方工具ClickHouse本身提供了一些备份和恢复的工具如clickhouse-backup可以方便地进行备份和恢复操作。第三方工具如BorgBackup它是一个开源的备份工具可以对ClickHouse数据进行高效的备份和恢复。学习资源ClickHouse官方文档官方文档是学习ClickHouse的最佳资源里面包含了详细的备份和恢复说明。相关书籍如《ClickHouse实战》可以帮助读者深入了解ClickHouse的使用和管理。未来发展趋势与挑战发展趋势自动化备份与恢复未来备份与恢复操作将越来越自动化减少人工干预提高效率和准确性。例如通过脚本和监控系统自动触发备份和恢复操作。云存储备份随着云计算的发展越来越多的企业会选择将备份数据存储在云端以提高数据的安全性和可访问性。智能备份策略根据数据的重要性、变化频率等因素自动生成最优的备份策略节省存储空间和时间。挑战数据量增长随着数据量的不断增长备份和恢复所需的时间和存储空间也会不断增加对备份和恢复系统的性能提出了更高的要求。数据一致性在进行备份和恢复时需要保证数据的一致性避免数据丢失或损坏。特别是在分布式环境下数据一致性的问题更加复杂。安全问题备份数据也需要保证安全性防止数据被泄露或篡改。需要采用加密、访问控制等技术来保障备份数据的安全。总结学到了什么核心概念回顾我们学习了ClickHouse的备份与恢复的基本概念包括备份、恢复、全量备份和增量备份。备份就是把数据复制一份存到其他地方恢复就是在数据丢失或损坏时把备份的数据重新放回数据库。全量备份是备份所有数据增量备份只备份变化的数据。概念关系回顾我们了解了备份和恢复是相互关联的备份是为了恢复做准备。全量备份和增量备份是备份的两种方式它们各有优缺点可以根据不同的情况选择使用。思考题动动小脑筋思考题一你能想到在什么情况下增量备份可能会比全量备份更麻烦吗思考题二如果ClickHouse数据库分布在多个节点上如何进行有效的备份和恢复附录常见问题与解答问题一备份过程中数据库可以正常使用吗解答在进行备份时数据库可以正常使用。但是在恢复数据时需要停止ClickHouse服务以保证数据的一致性。问题二增量备份的文件丢失了怎么办解答如果增量备份的文件丢失了可以使用最近一次的全量备份进行恢复。如果需要恢复到最新状态可能需要重新进行全量备份和增量备份。扩展阅读 参考资料ClickHouse官方文档https://clickhouse.com/docs/en/《ClickHouse实战》BorgBackup官方文档https://borgbackup.readthedocs.io/en/stable/

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…