.net天擎分鐘降水數據統計

1.需求:

計算滑動時間下的1小時、3小時、6小時、12小時、24小時降水數據,統計這個時間下的分鐘級降水數據

2.分析

第一版本:降水分鐘級數據保存時間不長,保存太多意義不大,以更新的形式來保存這些統計數據效果會比較好,使用管道先進先出的原則每5分鐘取一次數據,每次只需要取近5分鐘的數據即可,設置管道長度分別為12組、36組、72組,144組和288組降水數據,取夠數據之后將之前第一組的數據自動去除即可

版本分析:

優點:基本能達到在一次過程中的數據統計功能,而且占用內存很小,數據整體運行比較順暢,每次取的數據量比較小

缺點:數據統計不準確,雖然用了定時器的定數回調方法來處理數據,仍然存在數據統計不準的情況,這個問題初步判定為天擎數據的后期更新,但是管道內的數據沒有更新導致數據存在差異的問題,數據的準確性不能保證,棄用

第二個版本:保留每5分鐘更新一次數據的頻率,將近1小時、3小時、6小時、12小時、24小時降水數據直接進行統計,統計后的數據保存下來即可

版本分析:

優點:數據的準確性能保證,數據沒有差異

缺點:數據的體量比較大,內存占用比較大,在統計過程中存在內存占用很高的情況

版本更新:

在每次定時回調統計數據的方法中將每次調用后的法中對已經棄用的一些變量和占用內存較高的變量進行GC處理

更新分析:

優點:數據統計的內存占比在每次統計完成后會清理掉,占用的內存會比較小

缺點:每次都要統計很多數據,有些站點的數據在處理的時候會在時間段內漏報,在統計時會出現站點報錯,導致站點數據統計不上的情況,在統計的時候加上判斷

最終效果:

using System.Data;
using System.Data.SqlClient;
using System.Text;
using CMISS_DATA_Helper;
using Model;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NPOI.SS.Formula.Functions;class Program
{private static readonly Dictionary<string, decimal> hourlyAccumulator_1 = new Dictionary<string, decimal>();private static readonly Dictionary<string, decimal> hourlyAccumulator_3 = new Dictionary<string, decimal>();private static readonly Dictionary<string, decimal> hourlyAccumulator_6 = new Dictionary<string, decimal>();private static readonly Dictionary<string, decimal> hourlyAccumulator_12 = new Dictionary<string, decimal>();private static readonly Dictionary<string, decimal> hourlyAccumulator_24 = new Dictionary<string, decimal>();private static readonly object lockObj = new object();private static Timer timer;private static string DbConnectionString = "Data Source=.;Initial Catalog=Meteorological_Bz;User Id=sa;Password=sa123...;MultipleActiveResultSets=True";// 配置參數private static int IntervalMinutes = 5;private static int WindowSize_1 = (60 / IntervalMinutes) * 1; // 1小時 = 12 * 5分鐘private static int WindowSize_3 = (60 / IntervalMinutes) * 3;private static int WindowSize_6 = (60 / IntervalMinutes) * 6;private static int WindowSize_12 = (60 / IntervalMinutes) * 12;private static int WindowSize_24 = (60 / IntervalMinutes) * 24;private static string columns = "Station_Id_C,UPDATE_TIME,Datetime,PRE";private static string url = "";//天擎接口private static string AdminCode = "110000";//區劃碼private static string[] stationIds = getStations();//獲取站點數據
static JObject valueconfig;
static async Task Main(string[] args)
{// 初始化站點數據(假設已知400個站點ID)System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);using (System.IO.StreamReader file = new System.IO.StreamReader(AppDomain.CurrentDomain.BaseDirectory + "dataconfig.json", Encoding.UTF8)){valueconfig = JsonConvert.DeserializeObject<JObject>(file.ReadToEnd());file.Close();}DbConnectionString = valueconfig["conn"].ToString();if (valueconfig["stationIds"].ToString() != string.Empty) stationIds = valueconfig["stationIds"].ToString().Split(",");columns = valueconfig["columns"].ToString();url = valueconfig["url"].ToString();AdminCode = valueconfig["AdminCode"].ToString();IntervalMinutes = int.Parse(valueconfig["IntervalMinutes"].ToString());InitializeAccumulator(stationIds);// 初始化定時器(立即啟動,每5分鐘執行)timer = new Timer(ProcessWeatherData, null, 0, IntervalMinutes * 60 * 1000);Console.WriteLine("服務已啟動,按任意鍵退出...");Console.ReadKey();timer.Dispose();
}
// 初始化累加器(所有站點歸零)
private static void InitializeAccumulator(string[] stationIds)
{lock (lockObj){Console.WriteLine("初始化站點!");foreach (var id in stationIds){hourlyAccumulator_1[id] = 0;hourlyAccumulator_3[id] = 0;hourlyAccumulator_6[id] = 0;hourlyAccumulator_12[id] = 0;hourlyAccumulator_24[id] = 0;}}
}// 定時器回調方法private static async void ProcessWeatherData(object state){try{InitializeAccumulator(stationIds);// 1. 獲取API數據var currentData_1 = await FetchWeatherDataAsync(60 * 1);var currentData_3 = await FetchWeatherDataAsync(60 * 3);var currentData_6 = await FetchWeatherDataAsync(60 * 6);var currentData_12 = await FetchWeatherDataAsync(60 * 12);var currentData_24 = await FetchWeatherDataAsync(60 * 24);lock (lockObj){try{foreach (var kvp in currentData_1){if (hourlyAccumulator_1.ContainsKey(kvp.Key)){hourlyAccumulator_1[kvp.Key] += kvp.Value;}else{hourlyAccumulator_1.Add(kvp.Key, kvp.Value);}}//Console.WriteLine($"{DateTime.Now}: 1小時降水已統計");}catch (Exception ex){Console.WriteLine($"1小時降水已統計異常{ex.Message}");}try{foreach (var kvp in currentData_3){if (hourlyAccumulator_3.ContainsKey(kvp.Key)){hourlyAccumulator_3[kvp.Key] += kvp.Value;}else{hourlyAccumulator_3.Add(kvp.Key, kvp.Value);}}}catch (Exception ex){Console.WriteLine($"3小時降水已統計異常{ex.Message}");}try{foreach (var kvp in currentData_6){if (hourlyAccumulator_6.ContainsKey(kvp.Key)){hourlyAccumulator_6[kvp.Key] += kvp.Value;}else{hourlyAccumulator_6.Add(kvp.Key, kvp.Value);}}}catch (Exception ex){Console.WriteLine($"6小時降水已統計異常{ex.Message}");}try{foreach (var kvp in currentData_12){if (hourlyAccumulator_12.ContainsKey(kvp.Key))hourlyAccumulator_12[kvp.Key] += kvp.Value;else{hourlyAccumulator_12.Add(kvp.Key, kvp.Value);}}}catch (Exception ex){Console.WriteLine($"12小時降水已統計異常{ex.Message}");}try{foreach (var kvp in currentData_24){if (hourlyAccumulator_24.ContainsKey(kvp.Key))hourlyAccumulator_24[kvp.Key] += kvp.Value;else{hourlyAccumulator_24.Add(kvp.Key, kvp.Value);}}}catch (Exception ex){Console.WriteLine($"24小時降水已統計異常{ex.Message}");}// 4. 更新數據庫UpdateDatabase(hourlyAccumulator_1, hourlyAccumulator_3, hourlyAccumulator_6, hourlyAccumulator_12, hourlyAccumulator_24);Console.WriteLine($"{DateTime.Now}:近小時數據已更新");//5.釋放內存try{Console.WriteLine($"{DateTime.Now}:釋放內存");currentData_1.Clear();currentData_1.TrimExcess();currentData_1 = null;currentData_3.Clear();currentData_3.TrimExcess();currentData_3 = null;currentData_6.Clear();currentData_6.TrimExcess();currentData_6 = null;currentData_12.Clear();currentData_12.TrimExcess();currentData_12 = null;currentData_24.Clear();currentData_24.TrimExcess();currentData_24 = null;hourlyAccumulator_1.Clear();hourlyAccumulator_1.TrimExcess();hourlyAccumulator_3.Clear();hourlyAccumulator_3.TrimExcess();hourlyAccumulator_6.Clear();hourlyAccumulator_6.TrimExcess();hourlyAccumulator_12.Clear();hourlyAccumulator_12.TrimExcess();hourlyAccumulator_24.Clear();hourlyAccumulator_24.TrimExcess();GC.Collect();GC.WaitForPendingFinalizers();GC.Collect();}catch (Exception ex){Console.WriteLine(ex.ToString());}}}catch (Exception ex){Console.WriteLine($"處理失敗: {ex.Message}");}}private static async Task<Dictionary<string, decimal>> FetchWeatherDataAsync(int minute){
//獲取天擎數據,并異步返回Dictionary數據return data;
}private static void UpdateDatabase(Dictionary<string, decimal> data_1, Dictionary<string, decimal> data_3, Dictionary<string, decimal> data_6, Dictionary<string, decimal> data_12, Dictionary<string, decimal> data_24){
//更新數據庫
}
}

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

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

相關文章

圖片合并pdf

文章目錄 背景目標實現下載 背景 整合&#xff1a; 將零散的圖片集合成一個單一文件。有序化&#xff1a; 固定圖片的排列順序。標準化&#xff1a; 轉換為通用、兼容性強的PDF格式。高效管理&#xff1a; 便于存儲、查找、分享和傳輸。正式化/文檔化&#xff1a; 滿足提交、報…

【vue3+js】文件下載方法整理

前端文件下載方式 引言 在前端開發中,文件下載是一個常見的需求。后端可能以不同的方式返回文件數據,前端需要根據不同的返回類型采用相應的處理方式。本文將總結幾種常見的后端返回類型及對應的前端處理方案,主要基于Vue3和JavaScript環境。 一、后端返回文件URL 場景描…

MicrobiomeStatPlots | 森林圖教程Forest plot tutorial

視頻講解https://www.bilibili.com/video/BV1mA3yzEEnc/森林圖簡介什么是森林圖&#xff1f;參考&#xff1a;https://mp.weixin.qq.com/s/vwNf_sFlmhp7DeSYaQ3NxQ森林圖是以統計指標和統計分析方法為基礎&#xff0c;用數值運算結果繪制出的圖形。它在平面直角坐標系中&#x…

vscode 打開項目時候,有部分外部依賴包找不到定義或者聲明,但是能使用cmake正常編譯并且運行

解決&#xff1a;是依賴路徑的問題&#xff0c;先看includePath對不對&#xff0c;但是有時候會依賴外部文件&#xff0c;這時候入股cmake編譯能夠聽過&#xff0c; 說明編譯器能夠找到依賴路徑&#xff0c; 但是vscode的 IntelliSense 找不到依賴路徑 → 導致編輯器提示錯誤、…

nginx:SSL_CTX_use_PrivateKey failed

SSL_CTX_use_PrivateKey("/home/nginx-vue/cret/*.com.key") failed (SSL: error:0B080074:x509 certificate routines:x509_check_private_key:key values mismatch) Nginx 嘗試加載私鑰文件時失敗&#xff0c;原因是&#xff1a;證書與私鑰不匹配 問題本質 SSL 證…

Docker 基于 Cgroups 實現資源限制詳解【實戰+源碼】

本文將帶你深入理解 Docker 如何借助 Linux Cgroups 實現對內存、CPU 等系統資源的精細化控制&#xff0c;并提供完整演示與圖解、Compose 配置模板和資源包下載&#xff0c;適合初學者與工程師深入學習與實戰。 文章目錄 一、什么是 Cgroups&#xff1f;為什么對容器如此關鍵…

Linux中的系統日志(Rsyslog)

一、實驗環境主機名系統網絡適配器IP地址serverarhel9NAT模式172.25.254.11/24serverbrhel9NAT模式172.25.254.22/24二、Rsyslog的基本參數&#xff08;1&#xff09;安裝rsyslog&#xff08;2&#xff09;rsyslog的服務名稱&#xff08;3&#xff09;rsyslog的主配置文件rsysl…

Spring Boot + Thymeleaf + RESTful API 前后端整合完整示例

關鍵詞&#xff1a;Spring Boot、Thymeleaf、RESTful API、前后端整合、用戶管理 ? 功能概述 本文將為你提供一個完整的 Spring Boot Thymeleaf RESTful API 的前后端整合項目&#xff0c;實現以下功能&#xff1a; 模塊功能用戶管理查看用戶列表、新增用戶、刪除用戶后端…

從零開始的MySQL學習

MySQL 從零開始的MySQL學習 第一節 數據庫 重點&#xff1a;數據庫通過SQL等標準語言進行動作&#xff0c;數據庫的概念、分類&#xff0c;數據管理系統&#xff08;操縱和管理數據庫的大型軟件&#xff09; 數據庫&#xff08;Database&#xff09; 是按照數據結構來組織、存儲…

Docker 高級管理--Dockerfile鏡像制作

二:Dockerfile 語法基礎 1:基礎指令 (1)FROM 指定基礎鏡像&#xff0c;所有的 Dockerfile 都必須以 FROM 指令開頭&#xff0c;它定義了新鏡像基于哪個基礎鏡像構建。 FRoM ubuntu:20.04 (2)MAINTAINER(已奔用&#xff0c;推薦使用LABEL) 用于指定鏡像的維護者信息。不過在較…

LeetCode 692題解 | 前K個高頻單詞

前K個高頻單詞一、題目鏈接二、題目三、分析四、代碼一、題目鏈接 692.前K個高頻單詞 二、題目 三、分析 本題目我們利用map統計出次數以后&#xff0c;返回的答案應該按單詞出現頻率由高到低排序&#xff0c;有一個特殊要求&#xff0c;如果不同的單詞有相同出現頻率&#…

C++ 中的 std::bind 用法

在現代 C++ 編程中,std::bind 是一個非常強大但常常被誤解的工具。它允許我們將函數(包括成員函數)、參數進行綁定,并生成一個新的可調用對象。這在編寫異步回調、事件處理、適配器模式等場景中非常有用。 ?? 一、std::bind 是什么? std::bind 是定義在 <functiona…

Spring Boot秒級冷啟動方案:阿里云FC落地實戰(含成本對比)

Spring Boot秒級冷啟動方案&#xff1a;阿里云FC落地實戰&#xff08;含成本對比&#xff09;一、冷啟動痛點與FC核心優勢1. 傳統Spring Boot冷啟動瓶頸2. 阿里云FC核心能力二、秒級冷啟動架構設計1. 整體架構2. 關鍵組件選型三、5大核心優化策略1. 應用瘦身&#xff08;JAR包精…

搜索引擎vs向量數據庫:LangChain混合檢索架構實戰解析

本文較長&#xff0c;建議點贊收藏&#xff0c;以免遺失。更多AI大模型應用開發學習視頻及資料&#xff0c;盡在聚客AI學院。一、LangChain搜索工具實戰&#xff1a;集成DuckDuckGo實現實時信息查詢 核心場景&#xff1a;解決大模型知識滯后問題&#xff0c;通過搜索引擎獲取實…

【算法】貪心算法:將數組和減半的最少操作次數C++

文章目錄前言題目解析算法原理代碼示例策略證明前言 題目的鏈接&#xff0c;大家可以先試著去做一下再來看一下思路。2208. 將數組和減半的最少操作次數 - 力扣&#xff08;LeetCode&#xff09; 題目解析 要認真去把題目看一遍&#xff0c;畫出題目中的有用信息。 示例一定是…

git異常退出,應該是內存不足

這次下載代碼&#xff1a; 公司虛擬機到了一定步驟&#xff0c;肯定退出。而家里的虛擬機則完全正常。我把家里的虛擬機復制到公司&#xff0c;還是崩潰。 差異在哪里&#xff1f;公司電腦虛擬機內存設置為10G&#xff0c;家里的16。因為家里電腦64G內存。 后來確認&#xff…

機器學習13——支持向量機下

支持向量機下 非線性支持向量機&#xff08;Non-linear SVMs&#xff09;詳解 核心思想 當數據在原始空間線性不可分時&#xff0c;通過**核技巧&#xff08;Kernel Trick&#xff09;**將數據映射到高維特征空間&#xff0c;使其在該空間中線性可分。 比如以下的樣本在一維空間…

GPT-4和Claude哪個好

選擇GPT-4還是Claude?這就像在問“蘋果還是橙子哪個更好”——?答案完全取決于你的具體需求?。兩者都是頂尖大語言模型,但各有特色。 我為你做了詳細對比,幫你快速定位哪個更適合你: ?? 核心能力對比 特性GPT-4 (OpenAI)Claude (Anthropic)?語言理解/推理?頂尖水平,…

RHCE考試 ——筆記

RHCE模擬測試exam_start ehcerht-vmctl start all考前說明? 請勿更改 IP 地址。DNS 解析完整主機名&#xff0c;同時也解析短名稱。? 所有系統的 root 密碼都是 redhat? Ansible 控制節點上已創建用戶賬戶 devops。可以使用 ssh 訪問? 所需的所有鏡像保存在鏡像倉庫 utilit…

信創 CDC 實戰 | TiDB 實時入倉難點與解決方案解析(以 ClickHouse 為例)

國產數據庫加速進入核心系統&#xff0c;傳統同步工具卻頻頻“掉鏈子”。本系列文章聚焦 OceanBase、GaussDB、TDSQL、達夢等主流信創數據庫&#xff0c;逐一拆解其日志機制與同步難點&#xff0c;結合 TapData 的實踐經驗&#xff0c;系統講解從 CDC 捕獲到實時入倉&#xff0…