MongoDB 聚合查詢超時:索引優化與分片策略的踩坑記錄

人們眼中的天才之所以卓越非凡,并非天資超人一等而是付出了持續不斷的努力。1萬小時的錘煉是任何人從平凡變成超凡的必要條件。———— 馬爾科姆·格拉德威爾
在這里插入圖片描述


🌟 Hello,我是Xxtaoaooo!
🌈 “代碼是邏輯的詩篇,架構是思想的交響”


摘要

最近遇到了一個比較難搞的的MongoDB性能問題,分享一下解決過程。我們公司的的電商平臺隨著業務增長,訂單數據已經突破了2億條,原本運行良好的用戶行為分析查詢開始出現嚴重的性能瓶頸。

問題的表現比較直觀:原本3秒內完成的聚合查詢,現在需要5分鐘甚至更長時間,經常出現超時錯誤。這個查詢涉及訂單、用戶、商品三個集合的關聯,需要按多個維度進行復雜的聚合統計。隨著數據量的增長,MongoDB服務器的CPU使用率飆升到95%,內存占用也接近極限。

面對這個問題,進行了系統性的性能優化。首先深入分析了查詢的執行計劃,發現了索引設計的不合理之處;然后重構了聚合管道的執行順序,讓數據過濾更加高效;最后實施了分片集群架構,解決了單機性能瓶頸。

整個優化過程持續了一周時間,期間踩了不少坑,但最終效果很顯著:查詢響應時間從5分鐘優化到3秒,性能提升了99%。更重要的是,我們建立了一套完整的MongoDB性能監控和優化體系,能夠及時發現和預防類似問題。

這次實踐讓我對MongoDB聚合框架有了更深入的理解,特別是在索引設計、管道優化、分片策略等方面積累了寶貴經驗。本文將詳細記錄這次優化的完整過程,包括問題定位方法、具體的優化策略、以及一些實用的最佳實踐,希望能為遇到類似問題的同行提供參考。


一、聚合查詢超時事故回顧

1.1 事故現象描述

數據分析平臺開始出現嚴重的性能問題:

  • 查詢響應時間激增:聚合查詢從3秒暴增至300秒
  • 超時錯誤頻發:80%的復雜聚合查詢出現超時
  • 系統資源耗盡:MongoDB服務器CPU使用率達到95%
  • 用戶體驗崩塌:數據報表生成失敗,業務決策受阻

在這里插入圖片描述

圖1:MongoDB聚合查詢超時故障流程圖 - 展示從數據激增到系統癱瘓的完整鏈路

1.2 問題定位過程

通過MongoDB的性能分析工具,我們快速定位了問題的根本原因:

// 查看當前正在執行的慢查詢
db.currentOp({"active": true,"secs_running": { "$gt": 10 }
})// 分析聚合查詢的執行計劃
db.orders.explain("executionStats").aggregate([{ $match: { createTime: { $gte: new Date("2024-01-01") } } },{ $lookup: { from: "users", localField: "userId", foreignField: "_id", as: "user" } },{ $group: { _id: "$user.region", totalAmount: { $sum: "$amount" } } }
])// 檢查索引使用情況
db.orders.getIndexes()

二、MongoDB聚合性能瓶頸深度解析

2.1 聚合管道執行原理

MongoDB聚合框架的性能瓶頸主要來源于管道階段的執行順序和數據流轉:

在這里插入圖片描述

圖2:MongoDB聚合管道執行時序圖 - 展示聚合操作的完整執行流程

2.2 性能瓶頸分析

通過深入分析,我們發現了幾個關鍵的性能瓶頸:

瓶頸類型問題表現影響程度優化難度
索引缺失全表掃描極高
$lookup性能笛卡爾積
內存限制磁盤排序
分片鍵設計數據傾斜
管道順序無效過濾

在這里插入圖片描述

圖3:MongoDB性能瓶頸分布餅圖 - 展示各類優化點的重要程度


三、索引優化策略實施

3.1 復合索引設計

基于查詢模式分析,我們重新設計了索引策略:

/*** 訂單集合索引優化* 基于ESR原則:Equality, Sort, Range*/// 1. 時間范圍查詢的復合索引
db.orders.createIndex({ "status": 1,           // Equality: 精確匹配"createTime": -1,      // Sort: 排序字段"amount": 1            // Range: 范圍查詢},{ name: "idx_status_time_amount",background: true       // 后臺創建,避免阻塞}
)// 2. 用戶維度分析索引
db.orders.createIndex({"userId": 1,"createTime": -1,"category": 1},{ name: "idx_user_time_category",partialFilterExpression: { "status": { $in: ["completed", "shipped"] } }}
)// 3. 地理位置聚合索引
db.orders.createIndex({"shippingAddress.province": 1,"shippingAddress.city": 1,"createTime": -1},{ name: "idx_geo_time" }
)

3.2 索引使用效果監控

我們實現了索引使用情況的實時監控:

/*** 索引效果分析工具* 監控索引命中率和查詢性能*/
class IndexMonitor {/*** 分析聚合查詢的索引使用情況*/analyzeAggregationIndexUsage(pipeline) {const explainResult = db.orders.explain("executionStats").aggregate(pipeline);const stats = explainResult.stages[0].$cursor.executionStats;return {indexUsed: stats.executionStats.indexName || "COLLSCAN",docsExamined: stats.totalDocsExamined,docsReturned: stats.totalDocsReturned,executionTime: stats.executionTimeMillis,indexHitRatio: stats.totalDocsReturned / stats.totalDocsExamined};}/*** 索引性能基準測試*/benchmarkIndexPerformance() {const testQueries = [// 時間范圍查詢[{ $match: { createTime: { $gte: new Date("2024-01-01"),$lte: new Date("2024-12-31")},status: "completed"}},{ $group: { _id: "$userId", total: { $sum: "$amount" } }}],// 地理維度聚合[{ $match: { createTime: { $gte: new Date("2024-11-01") } }},{ $group: { _id: {province: "$shippingAddress.province",city: "$shippingAddress.city"},orderCount: { $sum: 1 },avgAmount: { $avg: "$amount" }}}]];const results = testQueries.map((pipeline, index) => {const startTime = new Date();const result = db.orders.aggregate(pipeline).toArray();const endTime = new Date();return {queryIndex: index,executionTime: endTime - startTime,resultCount: result.length,indexAnalysis: this.analyzeAggregationIndexUsage(pipeline)};});return results;}
}

四、聚合管道優化技巧

4.1 管道階段重排序

通過調整聚合管道的執行順序,我們顯著提升了查詢性能:

/*** 聚合管道優化:從低效到高效的重構過程*/// ? 優化前:低效的管道順序
const inefficientPipeline = [// 1. 先進行關聯查詢(處理大量數據){$lookup: {from: "users",localField: "userId", foreignField: "_id",as: "userInfo"}},// 2. 再進行時間過濾(為時已晚){$match: {createTime: { $gte: new Date("2024-11-01") },"userInfo.region": "華東"}},// 3. 最后分組聚合{$group: {_id: "$userInfo.city",totalOrders: { $sum: 1 },totalAmount: { $sum: "$amount" }}}
];// ? 優化后:高效的管道順序
const optimizedPipeline = [// 1. 首先進行時間過濾(大幅減少數據量){$match: {createTime: { $gte: new Date("2024-11-01") },status: { $in: ["completed", "shipped"] }}},// 2. 添加索引提示,確保使用正確索引{ $hint: "idx_status_time_amount" },// 3. 在較小數據集上進行關聯{$lookup: {from: "users",let: { userId: "$userId" },pipeline: [{ $match: { $expr: { $eq: ["$_id", "$$userId"] },region: "華東"  // 在lookup內部進行過濾}},{ $project: { city: 1, region: 1 } }  // 只返回需要的字段],as: "userInfo"}},// 4. 過濾掉沒有匹配用戶的訂單{ $match: { "userInfo.0": { $exists: true } } },// 5. 展開用戶信息{ $unwind: "$userInfo" },// 6. 最終分組聚合{$group: {_id: "$userInfo.city",totalOrders: { $sum: 1 },totalAmount: { $sum: "$amount" },avgAmount: { $avg: "$amount" }}},// 7. 結果排序{ $sort: { totalAmount: -1 } },// 8. 限制返回數量{ $limit: 50 }
];

4.2 內存優化策略

針對大數據量聚合的內存限制問題,我們實施了多項優化措施:

/*** 內存優化的聚合查詢實現*/
class OptimizedAggregation {/*** 分批處理大數據量聚合* 避免內存溢出問題*/async processBatchAggregation(startDate, endDate, batchSize = 100000) {const results = [];let currentDate = new Date(startDate);while (currentDate < endDate) {const batchEndDate = new Date(currentDate);batchEndDate.setDate(batchEndDate.getDate() + 7); // 按周分批const batchPipeline = [{$match: {createTime: {$gte: currentDate,$lt: Math.min(batchEndDate, endDate)}}},{$group: {_id: {year: { $year: "$createTime" },month: { $month: "$createTime" },day: { $dayOfMonth: "$createTime" }},dailyRevenue: { $sum: "$amount" },orderCount: { $sum: 1 }}}];// 使用allowDiskUse選項處理大數據集const batchResult = await db.orders.aggregate(batchPipeline, {allowDiskUse: true,maxTimeMS: 300000,  // 5分鐘超時cursor: { batchSize: 1000 }}).toArray();results.push(...batchResult);currentDate = batchEndDate;// 添加延遲,避免對系統造成過大壓力await new Promise(resolve => setTimeout(resolve, 1000));}return this.mergeResults(results);}/*** 合并分批處理的結果*/mergeResults(batchResults) {const merged = new Map();batchResults.forEach(item => {const key = `${item._id.year}-${item._id.month}-${item._id.day}`;if (merged.has(key)) {const existing = merged.get(key);existing.dailyRevenue += item.dailyRevenue;existing.orderCount += item.orderCount;} else {merged.set(key, item);}});return Array.from(merged.values()).sort((a, b) => new Date(`${a._id.year}-${a._id.month}-${a._id.day}`) - new Date(`${b._id.year}-${b._id.month}-${b._id.day}`));}
}

五、分片集群架構設計

5.1 分片鍵選擇策略

基于數據訪問模式,我們設計了合理的分片策略:

在這里插入圖片描述

圖4:MongoDB分片集群架構圖 - 展示完整的分片部署架構

5.2 分片實施過程

/*** MongoDB分片集群配置實施*/// 1. 啟用分片功能
sh.enableSharding("ecommerce")// 2. 創建復合分片鍵
// 基于時間和用戶ID的哈希組合,確保數據均勻分布
db.orders.createIndex({ "createTime": 1, "userId": "hashed" })// 3. 配置分片鍵
sh.shardCollection("ecommerce.orders", { "createTime": 1, "userId": "hashed" },false,  // 不使用唯一約束{// 預分片配置,避免初始數據傾斜numInitialChunks: 12,  // 按月預分片presplitHashedZones: true}
)// 4. 配置分片標簽和區域
// 熱數據分片(最近3個月)
sh.addShardTag("shard01", "hot")
sh.addShardTag("shard02", "hot") // 溫數據分片(3-12個月)
sh.addShardTag("shard03", "warm")// 冷數據分片(12個月以上)
sh.addShardTag("shard04", "cold")// 5. 配置標簽范圍
const now = new Date();
const threeMonthsAgo = new Date(now.getFullYear(), now.getMonth() - 3, 1);
const twelveMonthsAgo = new Date(now.getFullYear() - 1, now.getMonth(), 1);// 熱數據區域
sh.addTagRange("ecommerce.orders",{ "createTime": threeMonthsAgo, "userId": MinKey },{ "createTime": MaxKey, "userId": MaxKey },"hot"
)// 溫數據區域  
sh.addTagRange("ecommerce.orders",{ "createTime": twelveMonthsAgo, "userId": MinKey },{ "createTime": threeMonthsAgo, "userId": MaxKey },"warm"
)// 冷數據區域
sh.addTagRange("ecommerce.orders", { "createTime": MinKey, "userId": MinKey },{ "createTime": twelveMonthsAgo, "userId": MaxKey },"cold"
)

六、性能監控與告警體系

6.1 實時性能監控

/*** MongoDB性能監控系統*/
class MongoPerformanceMonitor {constructor() {this.alertThresholds = {slowQueryTime: 5000,      // 5秒connectionCount: 1000,     // 連接數replicationLag: 10,       // 10秒復制延遲diskUsage: 0.85           // 85%磁盤使用率};}/*** 監控慢查詢*/async monitorSlowQueries() {const slowQueries = await db.adminCommand({"currentOp": true,"active": true,"secs_running": { "$gt": this.alertThresholds.slowQueryTime / 1000 }});if (slowQueries.inprog.length > 0) {const alerts = slowQueries.inprog.map(op => ({type: 'SLOW_QUERY',severity: 'HIGH',message: `慢查詢檢測: ${op.command}`,duration: op.secs_running,namespace: op.ns,timestamp: new Date()}));await this.sendAlerts(alerts);}}/*** 監控聚合查詢性能*/async monitorAggregationPerformance() {const pipeline = [{$currentOp: {allUsers: true,idleConnections: false}},{$match: {"command.aggregate": { $exists: true },"secs_running": { $gt: 10 }}},{$project: {ns: 1,command: 1,secs_running: 1,planSummary: 1}}];const longRunningAggregations = await db.aggregate(pipeline).toArray();return longRunningAggregations.map(op => ({namespace: op.ns,duration: op.secs_running,pipeline: op.command.pipeline,planSummary: op.planSummary,recommendation: this.generateOptimizationRecommendation(op)}));}/*** 生成優化建議*/generateOptimizationRecommendation(operation) {const recommendations = [];// 檢查是否使用了索引if (operation.planSummary && operation.planSummary.includes('COLLSCAN')) {recommendations.push('建議添加適當的索引以避免全表掃描');}// 檢查聚合管道順序if (operation.command.pipeline) {const pipeline = operation.command.pipeline;const matchIndex = pipeline.findIndex(stage => stage.$match);const lookupIndex = pipeline.findIndex(stage => stage.$lookup);if (lookupIndex >= 0 && matchIndex > lookupIndex) {recommendations.push('建議將$match階段移到$lookup之前以減少處理數據量');}}return recommendations;}
}

6.2 性能優化效果

通過系統性的優化,我們取得了顯著的性能提升:

在這里插入圖片描述

圖5:MongoDB性能優化效果對比圖 - 展示各階段優化的效果


七、最佳實踐與避坑指南

7.1 MongoDB聚合優化原則

核心原則在MongoDB聚合查詢中,數據流的方向決定了性能的上限。優秀的聚合管道設計應該遵循"早過濾、晚關聯、巧排序"的基本原則,讓數據在管道中越流越少,而不是越流越多。

基于這次實戰經驗,我總結了以下最佳實踐:

  1. 索引先行:聚合查詢的性能基礎是合適的索引
  2. 管道優化match盡量前置,match盡量前置,match盡量前置,lookup盡量后置
  3. 內存管理:合理使用allowDiskUse和分批處理
  4. 分片設計:選擇合適的分片鍵,避免熱點數據

7.2 常見性能陷阱

陷阱類型具體表現解決方案預防措施
索引缺失COLLSCAN全表掃描創建復合索引查詢計劃分析
管道順序lookup在lookup在lookupmatch前重排管道階段代碼審查
內存溢出超過100MB限制allowDiskUse分批處理
數據傾斜分片不均勻重新選擇分片鍵數據分布監控
跨分片查詢性能急劇下降優化查詢條件分片鍵包含

7.3 運維監控腳本

#!/bin/bash
# MongoDB性能監控腳本echo "=== MongoDB性能監控報告 ==="
echo "生成時間: $(date)"# 1. 檢查慢查詢
echo -e "\n1. 慢查詢檢測:"
mongo --eval "
db.adminCommand('currentOp').inprog.forEach(function(op) {if (op.secs_running > 5) {print('慢查詢: ' + op.ns + ', 運行時間: ' + op.secs_running + '秒');print('查詢: ' + JSON.stringify(op.command));}
});
"# 2. 檢查索引使用情況
echo -e "\n2. 索引使用統計:"
mongo ecommerce --eval "
db.orders.aggregate([{\$indexStats: {}},{\$sort: {accesses: -1}},{\$limit: 10}
]).forEach(function(stat) {print('索引: ' + stat.name + ', 訪問次數: ' + stat.accesses.ops);
});
"# 3. 檢查分片狀態
echo -e "\n3. 分片集群狀態:"
mongo --eval "
sh.status();
"# 4. 檢查復制集狀態
echo -e "\n4. 復制集狀態:"
mongo --eval "
rs.status().members.forEach(function(member) {print('節點: ' + member.name + ', 狀態: ' + member.stateStr + ', 延遲: ' + (member.optimeDate ? (new Date() - member.optimeDate)/1000 + '秒' : 'N/A'));
});
"echo -e "\n=== 監控報告完成 ==="

八、總結與思考

通過這次MongoDB聚合查詢超時事故的完整復盤,我深刻認識到了數據庫性能優化的系統性和復雜性。作為一名技術人員,我們不能僅僅滿足于功能的實現,更要深入理解底層原理,掌握性能優化的方法論。

這次事故讓我學到了幾個重要的教訓:首先,索引設計是MongoDB性能的基石,沒有合適的索引,再優秀的查詢也會變成性能殺手;其次,聚合管道的設計需要深入理解執行原理,合理的階段順序能夠帶來數量級的性能提升;最后,分片架構不是銀彈,需要根據實際的數據訪問模式進行精心設計。

在技術架構設計方面,我們不能盲目追求新技術,而要基于實際業務需求進行合理選擇。MongoDB的聚合框架雖然功能強大,但也有其適用場景和限制。通過建立完善的監控體系、制定合理的優化策略、實施漸進式的架構升級,我們能夠在保證功能的同時,顯著提升系統性能。

從團隊協作的角度來看,這次優化過程也讓我認識到了跨團隊協作的重要性。DBA團隊的索引建議、運維團隊的監控支持、業務團隊的需求澄清,每一個環節都至關重要。通過建立更好的溝通機制和技術分享文化,我們能夠更高效地解決復雜的技術問題。

最重要的是,我意識到性能優化是一個持續的過程,而不是一次性的任務。隨著業務的發展和數據量的增長,我們需要不斷地監控、分析、優化。建立自動化的監控告警體系,制定標準化的優化流程,培養團隊的性能意識,這些都是長期工程。

這次實戰經歷讓我更加堅信:優秀的系統不是一開始就完美的,而是在持續的優化中不斷進化的。通過深入理解技術原理、建立系統性的方法論、保持持續學習的心態,我們能夠構建出更加高效、穩定、可擴展的數據庫系統。希望這篇文章能夠幫助更多的技術同行在MongoDB性能優化的道路上少走彎路,讓我們的系統能夠更好地支撐業務的快速發展。


🌟 嗨,我是Xxtaoaooo!
?? 【點贊】讓更多同行看見深度干貨
🚀 【關注】持續獲取行業前沿技術與經驗
🧩 【評論】分享你的實戰經驗或技術困惑
作為一名技術實踐者,我始終相信:
每一次技術探討都是認知升級的契機,期待在評論區與你碰撞靈感火花🔥

參考鏈接

  1. MongoDB官方文檔 - 聚合管道優化
  2. MongoDB索引設計最佳實踐
  3. MongoDB分片集群部署指南
  4. MongoDB性能監控工具詳解
  5. MongoDB聚合框架性能調優實戰

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/95283.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/95283.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/95283.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Augmentcode免費額度AI開發WordPress商城實戰

Augment AI開發WordPress商城實戰&#xff1a;從零構建到免費額度續杯完整指南 前言 在AI編程工具日益普及的今天&#xff0c;如何高效利用這些工具來開發實際項目成為了開發者關注的焦點。本文將詳細介紹如何使用Augment AI從零開始構建一個功能完整的WordPress商城系統&#…

【C++八股文】數據結構篇

一、單例模式優化實現 原代碼問題分析 ?內存序重排序風險?&#xff1a;雙重檢查鎖在C中可能因指令重排導致半初始化對象被訪問?鎖粒度過大?&#xff1a;每次獲取實例都需要加鎖&#xff0c;影響性能?線程安全性不足?&#xff1a;未考慮C11前的內存模型問題 改進方案&a…

并發編程——15 線程池ForkJoinPool實戰及其工作原理分析

1 一道算法題引發的思考及其實現 1.1 算法題 問&#xff1a;如何充分利用多核 CPU 的性能&#xff0c;快速對一個2千萬大小的數組進行排序&#xff1f; 這道題可以通過歸并排序來解決&#xff1b; 1.2 什么是歸并排序&#xff1f; 歸并排序&#xff08;Merge Sort&#xff…

Kafka面試精講 Day 6:Kafka日志存儲結構與索引機制

【Kafka面試精講 Day 6】Kafka日志存儲結構與索引機制 在“Kafka面試精講”系列的第6天&#xff0c;我們將深入剖析 Kafka的日志存儲結構與索引機制。這是Kafka高性能、高吞吐量背后的核心設計之一&#xff0c;也是中高級面試中的高頻考點。面試官常通過這個問題考察候選人是否…

Linux 字符設備驅動框架學習記錄(三)

Linux字符設備驅動開發新框架詳解 一、新舊驅動框架對比 傳統字符設備驅動流程 手動分配設備號 (register_chrdev_region)實現file_operations結構體使用mknod手動創建設備節點 新式驅動框架優勢 自動設備號分配&#xff1a;動態申請避免沖突自動節點創建&#xff1a;通過class…

《計算機網絡安全》實驗報告一 現代網絡安全挑戰 拒絕服務與分布式拒絕服務攻擊的演變與防御策略(1)

目 錄 摘 要 一、研究背景與目的 1.1 介紹拒絕服務&#xff08;DoS&#xff09;和分布式拒絕服務&#xff08;DDoS&#xff09;攻擊的背景 &#xff08;1&#xff09;拒絕服務攻擊&#xff08;DoS&#xff09;  &#xff08;2&#xff09;分布式拒絕服務攻擊&#xff0…

深度學習篇---模型組成部分

模型組成部分&#xff1a;在 PyTorch 框架下進行圖像分類任務時&#xff0c;深度學習代碼通常由幾個核心部分組成。這些部分中有些可以在不同網絡間復用&#xff0c;有些則需要根據具體任務或網絡結構進行修改。下面我將用通俗易懂的方式介紹這些組成部分&#xff1a;1. 數據準…

關于ANDROUD APPIUM安裝細則

1&#xff0c;可以先參考一下連接 PythonAppium自動化完整教程_appium python教程-CSDN博客 2&#xff0c;appium 需要對應的版本的node&#xff0c;可以用nvm對node 進行版本隔離 3&#xff0c;對應需要安裝android stuido 和對應的sdk &#xff0c;按照以上連接進行下載安…

八、算法設計與分析

1 算法設計與分析的基本概念 1.1 算法 定義 &#xff1a;算法是對特定問題求解步驟的一種描述&#xff0c;是有限指令序列&#xff0c;每條指令表示一個或多個操作。特性 &#xff1a; 有窮性&#xff1a;算法需在有限步驟和時間內結束。確定性&#xff1a;指令無歧義&#xff…

機器學習從入門到精通 - 神經網絡入門:從感知機到反向傳播數學揭秘

機器學習從入門到精通 - 神經網絡入門&#xff1a;從感知機到反向傳播數學揭秘開場白&#xff1a;點燃你的好奇心 各位&#xff0c;有沒有覺得那些能識圖、懂人話、下棋碾壓人類的AI特別酷&#xff1f;它們的"大腦"核心&#xff0c;很多時候就是神經網絡&#xff01;…

神經網絡模型介紹

如果你用過人臉識別解鎖手機、刷到過精準推送的短視頻&#xff0c;或是體驗過 AI 聊天機器人&#xff0c;那么你已經在和神經網絡打交道了。作為深度學習的核心技術&#xff0c;神經網絡模仿人腦的信息處理方式&#xff0c;讓機器擁有了 “學習” 的能力。一、什么是神經網絡&a…

蘋果開發中什么是Storyboard?object-c 和swiftui 以及Storyboard到底有什么關系以及邏輯?優雅草卓伊凡

蘋果開發中什么是Storyboard&#xff1f;object-c 和swiftui 以及Storyboard到底有什么關系以及邏輯&#xff1f;優雅草卓伊凡引言由于最近有個客戶咨詢關于 蘋果內購 in-purchase 的問題做了付費咨詢處理&#xff0c;得到問題&#xff1a;“昨天試著把您的那幾部分code 組裝成…

孩子玩手機都近視了,怎樣限制小孩的手機使用時長?

最近兩周&#xff0c;我給孩子檢查作業時發現娃總是把眼睛瞇成一條縫&#xff0c;而且每隔幾分鐘就會用手背揉眼睛&#xff0c;有時候揉得眼圈都紅了。有一次默寫單詞&#xff0c;他把 “太陽” 寫成了 “大陽”&#xff0c;我給他指出來&#xff0c;他卻盯著本子說 “沒有錯”…

醫療AI時代的生物醫學Go編程:高性能計算與精準醫療的案例分析(六)

第五章 案例三:GoEHRStream - 實時電子病歷數據流處理系統 5.1 案例背景與需求分析 5.1.1 電子病歷數據流處理概述 電子健康記錄(Electronic Health Record, EHR)系統是現代醫療信息化的核心,存儲了患者從出生到死亡的完整健康信息,包括 demographics、診斷、用藥、手術、…

GEM5學習(2):運行x86Demo示例

創建腳本 配置腳本內容參考官網的說明gem5: Creating a simple configuration script 首先根據官方說明創建腳本文件 mkdir configs/tutorial/part1/ touch configs/tutorial/part1/simple.py simple.py 中的內容如下&#xff1a; from gem5.prebuilt.demo.x86_demo_board…

通過 FinalShell 訪問服務器并運行 GUI 程序,提示 “Cannot connect to X server“ 的解決方法

FinalShell 是一個 SSH 客戶端&#xff0c;默認情況下 不支持 X11 圖形轉發&#xff08;不像 ssh -X 或 ssh -Y&#xff09;&#xff0c;所以直接運行 GUI 程序&#xff08;如 Qt、GNOME、Matplotlib 等&#xff09;會報錯&#xff1a; Error: Cant open display: Failed to c…

1.人工智能——概述

應用領域 替代低端勞動&#xff0c;解決危險、高體力精力損耗領域 什么是智能制造&#xff1f;數字孿生&#xff1f;邊緣計算&#xff1f; 邊緣計算 是 數字孿生 的 “感官和神經末梢”&#xff0c;負責采集本地實時數據和即時反應。瑣碎數據不上傳總服務器&#xff0c;實時進行…

傳統園區能源轉型破局之道:智慧能源管理系統驅動的“源-網-荷-儲”協同賦能

傳統園區能源結構轉型 政策要求&#xff1a;福建提出2025年可再生能源滲透率≥25%&#xff0c;山東強調“源網荷儲一體化”&#xff0c;安徽要求清潔能源就地消納。系統解決方案&#xff1a;多能協同調控&#xff1a;集成光伏、儲能、充電樁數據&#xff0c;通過AI算法動態優化…

[光學原理與應用-353]:ZEMAX - 設置 - 可視化工具:2D視圖、3D視圖、實體模型三者的區別,以及如何設置光線的數量

在光學設計軟件ZEMAX中&#xff0c;2D視圖、3D視圖和實體模型是三種不同的可視化工具&#xff0c;分別用于從不同維度展示光學系統的結構、布局和物理特性。它們的核心區別體現在維度、功能、應用場景及信息呈現方式上&#xff0c;以下是詳細對比&#xff1a;一、維度與信息呈現…

《sklearn機器學習》——交叉驗證迭代器

sklearn 交叉驗證迭代器 在 scikit-learn (sklearn) 中&#xff0c;交叉驗證迭代器&#xff08;Cross-Validation Iterators&#xff09;是一組用于生成訓練集和驗證集索引的工具。它們是 model_selection 模塊的核心組件&#xff0c;決定了數據如何被分割&#xff0c;從而支持…