MongoDB 面试备战指南

MongoDB 面试备战指南


一、基础概念

1. MongoDB是什么类型的数据库?和关系型数据库有什么区别?
答案:
MongoDB是文档型NoSQL数据库,核心区别:

  • 数据模型:存储JSON-like文档(动态schema),而非固定表结构
  • 扩展性:天然支持水平扩展(分片),而关系型数据库通常垂直扩展
  • 事务:4.0版本前仅支持单文档事务,之后支持多文档ACID
  • 查询语言:使用丰富的查询API而非SQL
  • 性能:通过嵌入式文档减少join操作,适合高吞吐场景

2. 什么是BSON?
答案:
BSON = Binary JSON,特点:

  • 二进制编码格式,比JSON更高效(存储空间更小,解析更快)
  • 支持更多数据类型:Date、Binary Data、ObjectId等
  • 每个文档最大16MB限制

二、数据模型

3. 文档中的_id字段有什么特殊作用?
答案:

  • 每个文档必须有的唯一主键,默认自动生成ObjectId
  • ObjectId结构:4字节时间戳 +5字节机器ID +3字节进程ID +3字节计数器(确保分布式唯一性)
  • 可自定义_id值(如业务ID),但需保证集合内唯一

4. 嵌入式文档 vs 引用式关联 如何选择?
答案:

  • 嵌入式:适合一对少、数据频繁共同查询(如用户地址)

    // 示例
    {_id: 1,name: "John",addresses: [{city: "Beijing", street: "Xidan"}]
    }
    
  • 引用式:适合一对多或多对多,数据独立更新频繁(如评论系统)

    // posts集合
    {_id: 100, title: "MongoDB Guide"}// comments集合
    {post_id: 100, content: "Great!"}
    

三、查询与CRUD

5. 如何执行条件查询并排序?
答案:

db.users.find({age: {$gt: 18}},          // 条件:年龄>18{name: 1, email: 1}        // 投影:只返回name和email
).sort({createdAt: -1})      // 按创建时间倒序.limit(10)                  // 限制10条

6. 更新操作符 s e t 和 set和 setinc有什么区别?
答案:

  • $set:设置字段值(不存在则创建)

    db.products.update({_id:1}, {$set: {price: 99}})
    
  • $inc:对数字字段增减

    db.products.update({_id:1}, {$inc: {stock: -1}}) // 库存减1
    

四、索引机制

7. MongoDB索引底层使用什么数据结构?
答案:

  • 默认使用B-Tree结构(B+树变种)
  • 支持快速范围查询和排序
  • 索引条目存储:<索引字段值, 文档物理地址>

8. 复合索引字段顺序如何影响查询?
答案:
遵循最左前缀原则

  • 索引{a:1, b:1, c:1}可优化以下查询:
    • a=1
    • a=1 AND b=2
    • a=1 AND b=2 AND c=3
  • 无法优化:b=2c=3单独查询

五、复制集(Replica Set)

9. 副本集故障转移过程是怎样的?
答案:

  1. 主节点不可达(心跳超时)
  2. 剩余节点发起选举(Raft算法)
  3. 获得多数投票的节点成为新主
  4. 应用端自动重连到新主节点

10. 什么是写关注(Write Concern)?
答案:
控制写操作持久化级别:

  • w:1:默认,主节点确认即返回
  • w:2:至少两个节点确认
  • w:"majority":大多数节点确认(确保数据安全)

11. 什么是读写偏好(Read Preference)?常用模式有哪些?
答案:
控制读请求的路由策略:

  • primary(默认):只从主节点读
  • secondary:只从从节点读
  • nearest:从网络延迟最低的节点读
  • primaryPreferred:优先主节点,不可用时切从节点
    场景示例:报表分析可使用secondary减轻主节点压力

12. 复制集数据同步原理是什么?
答案:
通过**Oplog(操作日志)**实现:

  1. 主节点记录所有写操作到local库的oplog集合
  2. 从节点定期拉取主节点oplog并重放操作
  3. Oplog是固定大小集合(循环覆盖旧数据)
    关键点:从节点同步延迟 = 最新oplog时间 - 最后应用时间

六、分片集群(Sharding)

13. 分片集群包含哪些核心组件?
答案:

  • mongos:路由进程,负责请求分发
  • config servers:存储元数据(分片键、chunk分布等)
  • shard:每个分片是独立的副本集,存储实际数据

14. 如何选择分片键?设计不当会有什么问题?
答案:
分片键选择原则:

  • 基数高(值分布广泛,如用户ID)
  • 写分布均匀(避免热点分片)
  • 匹配查询模式(常用查询条件包含分片键)
    错误案例:选择性别字段会导致数据分布不均

15. 什么是Chunk?何时触发Chunk迁移?
答案:

  • Chunk:分片键范围内的连续数据段(默认64MB)
  • 触发迁移的条件:
    • 某个分片的Chunk数量超过阈值
    • 执行shardCollection或手动split命令
      迁移过程由**平衡器(Balancer)**自动管理

七、聚合框架

16. 聚合管道有哪些常用阶段?
答案:

  • $match:过滤文档(类似WHERE)
  • $group:按字段分组聚合
  • $sort:排序
  • $project:重塑文档结构
  • $lookup:跨集合关联查询(类似LEFT JOIN)
    示例:统计每个城市的平均年龄
db.users.aggregate([{$match: {age: {$gt: 18}}}, {$group: {_id: "$city", avgAge: {$avg: "$age"}}}
])

17. 如何优化聚合查询性能?
答案:

  • 在管道开头使用$match$project减少数据处理量
  • 为常用聚合字段创建复合索引
  • 避免在$group阶段处理大量唯一值(内存限制默认100MB)
  • 使用$allowDiskUse允许临时写入磁盘

八、事务管理

18. MongoDB多文档事务的实现原理?
答案:

  • 基于快照隔离(Snapshot Isolation)
  • 事务内所有操作看到同一数据快照
  • 写冲突时通过锁机制解决(集合级或文档级锁)
  • 事务提交时写入oplog,同步到从节点
    注意:事务最大时长默认60秒,可配置

19. 事务和写操作原子性的区别?
答案:

  • 单文档原子性:MongoDB原生特性,无需开启事务
  • 多文档原子性:必须显式开启事务,保证多个操作全成功或全失败
    示例:转账操作需事务保证两个账户更新原子性

九、性能优化

20. 如何分析查询性能?
答案:

  • explain()方法:

    db.users.find({age: 25}).explain("executionStats")
    

    关键指标:

    • executionTimeMillis:查询耗时
    • totalKeysExamined:扫描索引条目数
    • totalDocsExamined:扫描文档数
    • stage:查询执行阶段(COLLSCAN表示全表扫描)

21. 覆盖查询(Covered Query)是什么?如何实现?
答案:

  • 定义:查询所需字段全部存在于索引中,无需回表
  • 实现条件:
    1. 查询字段和返回字段都在同一索引
    2. 不使用$elemMatch等复杂操作
      示例:
// 创建索引
db.users.createIndex({age:1, name:1})// 覆盖查询
db.users.find({age:25}, {_id:0, age:1, name:1})

十、安全管理

22. 如何创建只读用户?
答案:

use admin
db.createUser({user: "reportUser",pwd: "secret",roles: [{role: "read", db: "mydb"}]
})

23. 启用访问控制需要哪些步骤?
答案:

  1. 启动mongod时添加--auth参数
  2. 创建管理员用户(必须先在admin库创建)
  3. 应用连接时指定用户名/密码

十一、高级特性

24. Change Stream的实现原理?
答案

  • 核心机制:基于Oplog(操作日志)实时监听数据变更,类似数据库的“事件触发器”。

  • 工作流程

    1. 应用向MongoDB注册Change Stream监听
    2. MongoDB持续读取Oplog中的新操作
    3. 将符合条件的变更事件推送给客户端
  • 特性

    • 支持过滤特定集合、操作类型(insert/update/delete)
    • 提供resumeToken实现断点续传
    • 示例:实时同步数据到Elasticsearch
    const changeStream = db.orders.watch([{$match: { operationType: "insert" }
    }]);
    changeStream.on("change", (change) => {console.log("新订单:", change.fullDocument);
    });
    

25. GridFS适合存储什么类型的数据?
答案

  • 设计目的:存储和检索超过16MB(BSON文档大小限制)的大文件

  • 典型场景

    • 视频/音频文件
    • 大型日志文件
    • 高分辨率图片
  • 底层实现

    • 将文件分割为多个chunks(默认255KB)
    • 使用两个集合:
      • fs.files:存储文件元数据(文件名、大小等)
      • fs.chunks:存储二进制分块
  • 操作示例

    mongofiles --db=gridfs_db put video.mp4
    

26. MongoDB Atlas的主要功能?
答案

  • 核心功能
    • 全托管云数据库服务(自动备份、监控、扩缩容)
    • 全球多区域部署(低延迟访问)
    • 内置数据加密(传输中/静态数据)
    • 与AWS/Azure/GCP深度集成
  • 优势
    • 免运维:自动处理硬件故障、版本升级
    • 弹性扩展:一键添加分片或调整存储
    • 安全合规:SOC2、GDPR认证

十二、故障排查

31. 如何诊断慢查询?
答案

  • 步骤

    1. 启用慢查询日志:

      db.setProfilingLevel(1, { slowms: 100 }) // 记录超过100ms的操作
      
    2. 分析system.profile集合:

      db.system.profile.find().sort({ ts: -1 }).limit(10)
      
    3. 使用explain()查看执行计划:

      db.orders.find({ status: "pending" }).explain("executionStats")
      
  • 关键指标

    • COLLSCAN:全集合扫描 → 需加索引
    • docsExaminednReturned比例过高 → 查询效率低

32. 连接数暴增的可能原因?
答案

  • 常见原因
    • 连接池配置不当(如未复用连接)
    • 慢查询导致连接长时间占用
    • 应用BUG(未关闭闲置连接)
  • 解决方案
    • 监控连接数:db.serverStatus().connections
    • 优化查询性能
    • 调整maxPoolSize(默认100)
    • 使用连接池中间件(如MongoDB Driver的连接池管理)

十三、与SQL对比

41. MongoDB中如何实现SQL的JOIN操作?
答案

  • 方法1:嵌入式文档

    // SQL中的JOIN:
    SELECT * FROM orders JOIN users ON orders.user_id = users.id// MongoDB嵌入式设计:
    {_id: "order001",user: {  // 直接嵌入用户信息id: "user123",name: "Alice"},items: [...]
    }
    
  • 方法2:聚合管道$lookup

    db.orders.aggregate([{$lookup: {from: "users",        // 关联集合localField: "user_id",foreignField: "_id",as: "user_info"      // 输出字段}}
    ])
    
  • 限制$lookup性能低于嵌入式设计,需谨慎使用

42. 如何模拟SQL中的事务?
答案

  • 单文档操作:天然原子性(如更新嵌套数组)

  • 多文档事务:显式开启会话

    const session = db.getMongo().startSession();
    session.startTransaction();
    try {db.accounts.updateOne({ _id: "A", balance: { $gte: 100 } },{ $inc: { balance: -100 } },{ session });db.accounts.updateOne({ _id: "B" },{ $inc: { balance: 100 } },{ session });session.commitTransaction();
    } catch (error) {session.abortTransaction();
    }
    

十四、版本特性

51. 4.0版本的多文档事务限制?
答案

  • 关键限制
    • 事务最大时长60秒(可调,但影响性能)
    • 无法在分片集群中跨分片事务(4.2版本支持)
    • 事务中的写操作大小总和不能超过16MB
  • 最佳实践
    • 尽量缩短事务持续时间
    • 避免在事务中包含大文档操作

52. 5.0版本的时间序列集合特性?
答案

  • 设计目标:高效存储时间序列数据(如物联网传感器数据)

  • 核心优化

    • 数据按时间分桶存储,减少索引开销
    • 自动过期数据(TTL索引)
    • 更高的写入吞吐量
  • 创建示例

    db.createCollection("sensor_data", {timeseries: {timeField: "timestamp",metaField: "sensor_id",  // 分组字段(如设备ID)granularity: "minutes"   // 时间粒度(秒/分钟/小时)}
    });
    

十五、设计模式

61. 大文档存储的最佳实践
答案

  • 问题:文档超过16MB限制

  • 解决方案

    1. 拆分文档:将部分字段移到独立集合
    2. 使用GridFS存储大文件
    3. 压缩文本字段(如用gzip压缩JSON)
  • 示例

    // 原始文档
    { _id: 1,content: "非常长的文本..."  // 超过16MB
    }// 拆分后
    // main_docs集合
    { _id: 1, metadata: {...} }// chunks集合
    { doc_id: 1, chunk_num: 1, data: "..." }
    

62. 如何处理高频更新导致的锁竞争?
答案

  • 优化策略

    1. 使用更细粒度的文档设计(如将计数器拆分为独立文档)
    2. 利用$inc等原子操作符减少锁冲突
    3. 选择合适写入策略(writeConcern: { w: 0 } 不等待确认)
    4. 分片集群分散写压力
  • 示例

    // 原始设计(热点文档)
    { _id: "page_views", count: 1000000 }// 优化设计(分散到多个文档)
    { _id: "page_views_0", count: 250000 }
    { _id: "page_views_1", count: 250000 }
    // 查询时求和所有文档
    

十六、运维实战

81. 如何安全地执行集合重命名?
答案

  • 命令db.adminCommand({ renameCollection: "db1.old", to: "db1.new" })
  • 注意事项
    • 需在admin库执行
    • 目标集合不能已存在
    • 会瞬间阻塞所有相关操作
    • 副本集需在主节点执行
  • 推荐步骤
    1. 应用停写
    2. 执行重命名
    3. 验证数据完整性
    4. 恢复应用写入

82. 分片集群扩容的具体步骤?
答案

  • 横向扩容流程

    1. 部署新的分片副本集

    2. 连接到mongos,添加分片:

      sh.addShard("shard3/shard3-1:27017,shard3-2:27017")
      
    3. 平衡器自动迁移Chunk到新分片

    4. 监控迁移状态:sh.status()

  • 关键指标

    • 确保config servers有足够存储
    • 网络带宽影响迁移速度

(其余题目完整答案示例,可根据编号继续扩展)

十七、高级原理

90. WiredTiger存储引擎如何实现压缩?
答案

  • 压缩算法

    • 默认使用Snappy(快速压缩/解压)
    • 可选Zlib(更高压缩率)或Zstd(平衡型)
  • 压缩层级

    • 数据压缩:集合和索引数据
    • 日志压缩:WiredTiger预写日志(WAL)
  • 配置示例

    storage:wiredTiger:collectionConfig:blockCompressor: zstd
    

91. MongoDB的Journal日志机制是如何保证数据安全的?
答案:

  • 核心作用:在数据写入磁盘前提供崩溃恢复能力
  • 工作流程
    1. 写操作首先写入journal缓冲区
    2. 每100ms(默认)或达到1GB数据时刷盘一次
    3. 主数据文件异步写入(通过WiredTiger的checkpoint机制)
  • 关键参数
    • journal.commitIntervalMs:控制刷盘频率
    • storage.journal.enabled:可关闭(不推荐生产环境)
  • 恢复原理:崩溃后重启时,重放journal中的操作

92. WiredTiger的MVCC实现原理?
答案:

  • 多版本并发控制机制
    • 每个写操作创建新的数据版本
    • 读操作看到的是特定时间点的快照
    • 旧版本数据在无引用后被清理
  • 优势
    • 读写不互相阻塞
    • 避免脏读问题
  • 内存管理
    • 使用B-Tree结构存储多个版本
    • 缓存最近使用的版本以加速查询

十八、云原生与容器化

93. 如何在Kubernetes中部署MongoDB副本集?
答案:

  • 推荐方案

    1. 使用StatefulSet保证Pod身份持久化
    2. 每个Pod挂载独立PersistentVolume
    3. 通过Headless Service实现DNS发现
  • 关键配置示例

    # StatefulSet配置片段
    spec:serviceName: "mongodb"replicas: 3template:containers:- name: mongodbargs:- "--replSet"- "rs0"- "--bind_ip_all"
    
  • 初始化脚本:在第一个Pod执行rs.initiate()

94. MongoDB Atlas的无服务器实例有什么特点?
答案:

  • 核心特性
    • 按实际请求量自动扩缩容
    • 完全免运维(自动打补丁、备份)
    • 毫秒级冷启动
  • 适用场景
    • 突发流量应用
    • 开发测试环境
    • 低频访问的归档数据
  • 计费方式:按每秒实际使用的计算资源计费

十九、数据迁移

95. 如何将数据从MySQL迁移到MongoDB?
答案:

  • 工具选择

    • mongomirror:官方工具,支持实时同步
    • 自定义ETL脚本:使用Python(PyMongo+SQLAlchemy)
    • 中间格式:先导出为CSV/JSON再导入
  • 模式转换策略

    • 表→集合
    • 行→文档
    • 外键→嵌入式文档或引用
  • 示例命令

    mongoimport --uri="mongodb://target" --collection=users --file=users.json
    

二十、监控与调优

96. MongoDB Atlas提供了哪些监控指标?
答案:

  • 关键指标
    • CPU/Memory:资源使用率
    • OPCounter:查询/写入操作数
    • Replication Lag:副本延迟(秒)
    • Disk IOPS:磁盘吞吐量
    • Connections:当前连接数
  • 告警设置
    • 可配置阈值告警(如CPU>80%持续5分钟)
    • 集成Webhook通知到Slack/PagerDuty

97. 如何优化MongoDB的内存使用?
答案:

  • 配置优化
    • 设置wiredTigerCacheSizeGB(建议为可用内存的50-60%)
    • 启用压缩(Snappy或Zstd)
  • 查询优化
    • 使用投影减少返回字段
    • 避免全集合扫描
  • 监控工具
    • db.serverStatus().wiredTiger.cache
    • free -h查看系统内存使用

二十一、安全实践

98. 如何实现字段级加密?
答案:

  • 客户端字段级加密(CSFLE)

    1. 创建加密规则:
    {"fields": [{"path": "ssn","keyId": UUID("..."),"algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"}]
    }
    
    1. 应用端配置加密驱动
  • 服务端加密

    • 透明数据加密(TDE)
    • 需要企业版或Atlas

99. 如何防范注入攻击?
答案:

  • 预防措施

    • 始终使用驱动程序的BSON序列化方法
    • 禁止拼接查询字符串
  • 正确示例(Node.js):

    // 错误方式(易受注入)
    db.collection.find(`{name: "${userInput}"}`)// 正确方式
    db.collection.find({name: userInput})
    
  • 审计工具

    • mongodb-log-analyzer检测可疑查询

二十二、新兴趋势

100. MongoDB在AI/ML领域的应用场景有哪些?
答案:

  • 典型用例

    • 存储和检索向量数据(通过$vectorSearch)
    • 特征仓库管理
    • 实验元数据跟踪
  • 技术集成

    • 与TensorFlow/PyTorch配合
    • Atlas Vector Search实现相似性搜索
  • 示例架构

    前端 → MongoDB(用户数据) → 特征提取 → ML模型 → 结果写回MongoDB
    

面试技巧补充

  1. 原理深挖:当被问到索引时,可延伸到B+树与LSM树的对比
  2. 场景设计:准备"如何用MongoDB设计Twitter/电商系统"类问题
  3. 故障模拟:思考"如果主节点突然宕机,系统会发生什么?"
  4. 版本演进:了解最新7.0版本特性(如集群同步)

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

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

相关文章

毫米波雷达标定(2)

1. 前言 前面文章中介绍了产线上毫米波雷达的标定原理和流程,这篇文章则主要介绍其在线标定方法。相对于产线标定,在线标定具备使用自然场景而不是依赖特定标靶的优点,但因此其标定精度会相对差一点。在线标定一般应用于售出产品的维护场景,如果其标定结果精度可以满足使用…

Linux fority source和__builtin_xxx

这段代码是用于启用和配置 GCC/Clang 的 Fortify Source 安全机制的预处理指令。Fortify Source 主要用于在编译时增强对缓冲区溢出等内存安全问题的检查。以下是对每一部分的详细解释&#xff1a; 1. 最外层条件编译 # if CONFIG_FORTIFY_SOURCE > 0目的&#xff1a;检查…

SQL GROUP BY 自定义排序规则

在 SQL 中&#xff0c;GROUP BY 子句用于将结果集按一个或多个列进行分组。默认情况下&#xff0c;GROUP BY 会按照列的自然顺序&#xff08;如字母顺序或数字顺序&#xff09;进行排序。如果你需要按照自定义的排序规则对结果进行分组&#xff0c;可以使用 ORDER BY 子句结合 …

语言模型理论基础-持续更新-思路清晰

1.预训练 相似的任务A、B&#xff0c;任务A已经用大数据完成了训练&#xff0c;得到模型A。 我们利用-特征提取模型的-“浅层参数通用”的特性&#xff0c;使用模型A的浅层参数&#xff0c;其他参数再通过任务B去训练&#xff08;微调&#xff09;。 2.统计语言模型 通过条件…

ResNet与注意力机制:深度学习中的强强联合

引言 在深度学习领域&#xff0c;卷积神经网络&#xff08;CNN&#xff09;一直是图像处理任务的主流架构。然而&#xff0c;随着网络深度的增加&#xff0c;梯度消失和梯度爆炸问题逐渐显现&#xff0c;限制了网络的性能。为了解决这一问题&#xff0c;ResNet&#xff08;残差…

【C++】——C++11新特性

目录 前言 1.初始化列表 2.std::initializer_list 3.auto 4.decltype 5.nullptr 6.左值引用和右值引用 6.1右值引用的真面目 6.2左值引用和右值引用比较 6.3右值引用的意义 6.3.1移动构造 6.4万能引用 6.5完美转发——forward 结语 前言 C&#xff0c;这门在系统…

【C++网络编程】第5篇:UDP与广播通信

一、UDP协议核心特性 1. UDP vs TCP ​特性 ​UDP​TCP连接方式无连接面向连接&#xff08;三次握手&#xff09;可靠性不保证数据到达或顺序可靠传输&#xff08;超时重传、顺序控制&#xff09;传输效率低延迟&#xff0c;高吞吐相对较低&#xff08;因握手和确认机制&…

MOSN(Modular Open Smart Network)是一款主要使用 Go 语言开发的云原生网络代理平台

前言 大家好&#xff0c;我是老马。 sofastack 其实出来很久了&#xff0c;第一次应该是在 2022 年左右开始关注&#xff0c;但是一直没有深入研究。 最近想学习一下 SOFA 对于生态的设计和思考。 sofaboot 系列 SOFABoot-00-sofaboot 概览 SOFABoot-01-蚂蚁金服开源的 s…

微信小程序日常开发问题整理

微信小程序日常开发问题整理 1 切换渲染模式1.1 WebView 的链接在模拟器可以打开&#xff0c;手机上无法打开。 1 切换渲染模式 1.1 WebView 的链接在模拟器可以打开&#xff0c;手机上无法打开。 在 app.json 中看到如下配置项&#xff0c;那么当前项目就是 keyline 渲染模式…

【Altium Designer】铜皮编辑

一、动态铜皮与静态铜皮的区分与切换 动态铜皮&#xff08;活铜&#xff09;&#xff1a; 通过快捷键 PG 创建&#xff0c;支持自动避让其他网络对象&#xff0c;常用于大面积铺铜&#xff08;如GND或电源网络&#xff09;。修改动态铜皮后&#xff0c;需通过 Tools → Polygo…

Java「Deque」 方法详解:从入门到实战

Java Deque 各种方法解析&#xff1a;从入门到实战 在 Java 编程中&#xff0c;Deque&#xff08;双端队列&#xff09;是一个功能强大的数据结构&#xff0c;允许开发者从队列的两端高效地添加、删除和检查元素。作为 java.util 包中的一部分&#xff0c;Deque 接口继承自 Qu…

ffmpeg+QOpenGLWidget显示视频

​一个基于 ‌FFmpeg 4.x‌ 和 QOpenGLWidget的简单视频播放器代码示例&#xff0c;实现视频解码和渲染到 Qt 窗口的功能。 1&#xff09;ffmpeg库界面&#xff0c;视频解码支持软解和硬解方式。 硬解后&#xff0c;硬件解码完成需要将数据从GPU复制到CPU。优先采用av_hwf…

深入解析嵌入式内核:从架构到实践

一、嵌入式内核概述 嵌入式内核是嵌入式操作系统的核心组件&#xff0c;负责管理硬件资源、调度任务、处理中断等关键功能。其核心目标是在资源受限的环境中提供高效、实时的控制能力。与通用操作系统不同&#xff0c;嵌入式内核通常具有高度可裁剪性、实时性和可靠性&#xff…

20250324-使用 `nltk` 的 `sent_tokenize`, `word_tokenize、WordNetLemmatizer` 方法时报错

解决使用 nltk 的 sent_tokenize, word_tokenize、WordNetLemmatizer 方法时报错问题 第 2 节的手动方法的法1可解决大部分问题&#xff0c;可首先尝试章节 2 的方法 1. nltk.download(‘punkt_tab’) LookupError: *******************************************************…

『 C++ 』多线程同步:条件变量及其接口的应用实践

文章目录 条件变量概述条件变量简介条件变量的基本用法 案例&#xff1a;两个线程交替打印奇偶数代码解释 std::unique_lock::try_lock_until 介绍代码示例代码解释注意事项 std::condition_variable::wait 详细解析与示例std::condition_variable::wait 接口介绍代码示例代码解…

【VolView】纯前端实现CT三维重建-CBCT

文章目录 什么是CBCTCBCT技术路线使用第三方工具使用Python实现使用前端实现 纯前端实现方案优缺点使用VolView实现CBCT VolView的使用1.克隆代码2.配置依赖3.运行4.效果 进阶&#xff1a;VolView配合Python解决卡顿1.修改VtkThreeView.vue2.新增Custom3DView.vue3.Python生成s…

debug - 安装.msi时,为所有用户安装程序

文章目录 debug - 安装.msi时&#xff0c;为所有用户安装程序概述笔记试试在目标.msi后面直接加参数的测试 备注备注END debug - 安装.msi时&#xff0c;为所有用户安装程序 概述 为了测试&#xff0c;装了一个test.msi. 安装时&#xff0c;只有安装路径的选择&#xff0c;没…

Java Stream两种list判断字符串是否存在方案

这里写自定义目录标题 背景初始化方法一、filter过滤方法二、anyMatch匹配 背景 在项目开发中&#xff0c;经常遇到筛选list中是否包含某个子字符串&#xff0c;有多种方式&#xff0c;本篇主要介绍stream流的filter和anyMatch两种方案&#xff0c;记录下来&#xff0c;方便备…

DeepSeek vs 通义大模型:谁将主导中国AI的未来战场?

当你在深夜调试代码时,是否幻想过AI伙伴能真正理解你的需求?当企业面对海量数据时,是否期待一个真正智能的决策大脑? 这场由DeepSeek和通义领衔的大模型之争,正在重塑中国AI产业的竞争格局。本文将为你揭开两大技术巨头的终极对决! 一、颠覆认知的技术突破 1.1 改变游戏…

3. 轴指令(omron 机器自动化控制器)——>MC_SetOverride

机器自动化控制器——第三章 轴指令 12 MC_SetOverride变量▶输入变量▶输出变量▶输入输出变量 功能说明▶时序图▶重启运动指令▶多重启动运动指令▶异常 MC_SetOverride 变更轴的目标速度。 指令名称FB/FUN图形表现ST表现MC_SetOverride超调值设定FBMC_SetOverride_instan…