C++高效讀取大規模文本格式點云(windows)

需使用VS2017及以上版本,C++語言標準選擇C++17,支持OpenMP。

執行效率明顯優于ifstream + stof。

// 點云數據結構
struct PointXYZ {std::array<float, 3> coord;  
};float string_to_float_fast(const std::string& str) {float value;auto [ptr, ec] = std::from_chars(str.data(), str.data() + str.size(), value);if (ec != std::errc()) {// 處理錯誤(如非數字字符串)return 0.0f; // 或拋出異常}return value;
}uint8_t string_to_uchar_fast(const std::string& str) {unsigned int value;auto [ptr, ec] = std::from_chars(str.data(), str.data() + str.size(), value);if (ec != std::errc() || value > 255) {return 0; // 錯誤處理}return static_cast<uint8_t>(value);
}bool read_pointcloud_parallel(const std::string& filename, std::vector<PointData>& cloud) {struct CSVRow {std::string col1, col2, col3;};// --- 1. 打開文件并內存映射 ---HANDLE hFile = CreateFileA(filename.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);if (hFile == INVALID_HANDLE_VALUE) {//throw std::runtime_error("Failed to open file");printf("Failed to open file");return false;}DWORD fileSize = GetFileSize(hFile, NULL);HANDLE hMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);if (hMapping == NULL) {CloseHandle(hFile);printf("Failed to create file mapping");return false;//throw std::runtime_error("Failed to create file mapping");}const char* mappedData = static_cast<const char*>(MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, fileSize));if (mappedData == NULL) {CloseHandle(hMapping);CloseHandle(hFile);throw std::runtime_error("Failed to map view of file");}// --- 2. 分塊并行解析 ---std::vector<CSVRow> rows;rows.reserve(1000000); // 預分配//#pragma omp parallel{// 每個線程處理一塊數據int numThreads = omp_get_num_threads();int threadId = omp_get_thread_num();size_t chunkSize = fileSize / numThreads;size_t start = threadId * chunkSize;size_t end = (threadId == numThreads - 1) ? fileSize : (threadId + 1) * chunkSize;// 調整起始位置到行首if (threadId != 0) {while (start < fileSize && mappedData[start] != '\n') start++;if (start < fileSize) start++;}// 解析當前塊std::vector<CSVRow> localRows;size_t pos = start;while (pos < end) {size_t lineEnd = pos;while (lineEnd < fileSize && mappedData[lineEnd] != '\n') lineEnd++;std::string line(mappedData + pos, lineEnd - pos);pos = lineEnd + 1;// 分號分割3列size_t col1End = line.find(';');size_t col2End = line.find(';', col1End + 1);if (col3End != std::string::npos) {
//#pragma omp criticalrows.emplace_back(CSVRow{line.substr(0, col1End),line.substr(col1End + 1, col2End - col1End - 1),line.substr(col2End + 1)});}}}// --- 3. 清理資源 ---UnmapViewOfFile(mappedData);CloseHandle(hMapping);CloseHandle(hFile);cloud.resize(rows.size());
#pragma omp parallel forfor (int i = 0;i < rows.size();i++){cloud[i].coord[0] = string_to_float_fast(rows[i].col1);cloud[i].coord[1] = string_to_float_fast(rows[i].col2);cloud[i].coord[2] = string_to_float_fast(rows[i].col3);}return true;
}

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

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

相關文章

【Linux】進程信號的捕捉處理

個人主頁~ 進程信號的捕捉處理 一、信號捕捉處理的概述1、信號捕捉處理全過程2、用戶態和內核態的區別&#xff08;一&#xff09;用戶態&#xff08;二&#xff09;內核態&#xff08;三&#xff09;用戶態與內核態的切換&#xff08;四&#xff09;硬件條件 二、再談進程地址…

Nyquist內置函數-概述

1 Nyquist內置函數-概述 本章提供奈奎斯特&#xff08;Nyquist&#xff09;語言參考。操作按功能和抽象級別分類。奈奎斯特在兩個重要級別上實現&#xff1a;“高級”級別支持行為抽象&#xff0c;這意味著像 stretch 和 at 這樣的操作可以應用。這些函數是典型用戶期望使用的…

數據驅動防災:AI 大模型在地質災害應急決策中的關鍵作用。基于DeepSeek/ChatGPT的AI智能體開發

全球氣候變化加劇了滑坡、泥石流等地質災害的發生頻率與不確定性&#xff0c;傳統基于統計與物理模型的預測方法常受限于?數據稀疏性?與?動態耦合復雜性?。近年來&#xff0c;AI智能體&#xff08;AI Agents&#xff09;與大型語言模型&#xff08;LLMs&#xff09;的突破為…

光譜相機在工業中的應用

光譜相機&#xff08;多光譜、高光譜、超光譜成像技術&#xff09;在工業領域通過捕捉物質的光譜特征&#xff08;反射、透射、輻射等&#xff09;&#xff0c;結合化學計量學與人工智能算法&#xff0c;為工業檢測、質量控制和工藝優化提供高精度、非接觸式的解決方案。以下是…

Dify工作流中如何去除deepseek-r1思考內容

在工作流中deepseek-r1的think標簽內部的內容&#xff0c;很容易讓工作流其他的llm產生幻覺&#xff0c;導致不能良好的生成目標效果。 我們通過代碼的方式讓deepseek-r1既有think思考鏈的效果&#xff0c;又不傳遞思考鏈。 工作流的邏輯為上圖 去除think中的代碼為 import re…

容器的CPU

1、限制進程的CPU 通過Cgroup來限制進程資源的使用&#xff0c;CPU Cgroup 是 Cgroups 其中的一個 Cgroups 子系統&#xff0c;它是用來限制進程的 CPU 使用的。 cpu.cfs_period_us&#xff0c;它是 CFS 算法的一個調度周期&#xff0c;一般它的值是 100000&#xff0c;以 mic…

【系統分析師-第二篇】

學習目標 通過參加考試&#xff0c;訓練學習能力&#xff0c;而非單純以拿證為目的。 1.在復習過程中&#xff0c;訓練快速閱讀能力、掌握三遍讀書法、運用番茄工作法。 2.從底層邏輯角度理解知識點&#xff0c;避免死記硬背。 3.通過考試驗證學習效果。 學習方法 第二遍快速…

【再探圖論】深入理解圖論經典算法

一、bellman_ford 1. 是什么松弛 在《算法四》中&#xff0c;對松弛的解釋是&#xff1a;relax the edge&#xff0c;看起來比較抽象&#xff0c;不過如果我們從生活中的實例去理解&#xff0c;就簡單多了&#xff1a; 試想一根繩索&#xff0c;當你握著繩索的兩頭使勁用力拉…

基于pycharm的YOLOv11模型訓練方法

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、前期準備1.1 軟件環境配置1.2 訓練集參考 二、訓練步驟2.1 打開文件夾2.2 打開文件2.3 data.yaml最終代碼 三、train.py四、最終結果五、detect.py六、 拓展…

用nodejs連接mongodb數據庫對標題和內容的全文本搜索,mogogdb對文檔的全文本索引的設置以及用node-rs/jieba對標題和內容的分詞

//首先我們要在Nodejs中安裝 我們的分詞庫node-rs/jieba,這個分詞不像jieba安裝時會踩非常多的雷&#xff0c;而且一半的機率都是安裝失敗&#xff0c;node-rs/jieba比jieba庫要快20-30%&#xff1b;安裝分詞庫是為了更好達到搜索的效果 這個庫直接npm install node-rs/jieba即…

水下聲吶探測儀,應急救援中的高效水下定位技術|深圳鼎躍

近年來&#xff0c;隨著水域活動增多及自然災害頻發&#xff0c;水下救援需求日益增長。傳統人工打撈方法在復雜水域中效率低、風險高&#xff0c;尤其在能見度差、水流湍急或深水區域中&#xff0c;救援難度倍增。 在此背景下&#xff0c;水下聲吶探測儀憑借其聲波定位與視頻…

AI 網關代理 LLMs 最佳實踐

作者&#xff1a;付宇軒&#xff08;計緣&#xff09; DeepSeek/QWen 普惠 AI 趨勢 隨著 DeepSeek-R1 的橫空出世&#xff0c;又一次點燃了原本已經有點冷淡的大語言模型市場和話題&#xff0c;并且快速成為了現象級&#xff0c;小到中小學生&#xff0c;大到父母輩都知道了中…

策略模式實際用處,改吧改吧直接用,兩種方式

controller RestController RequestMapping("admin/test") RequiredArgsConstructor(onConstructor __(Autowired)) public class TestController {Autowiredprivate VideoFactory VideoFactory;GetMapping("getList")public R getList(){// 第一種方式T…

chromium魔改——修改 navigator.webdriver 檢測

chromium源碼官網 https://source.chromium.org/chromium/chromium/src 說下修改的chromium源碼思路&#xff1a; 首先在修改源碼過檢測之前&#xff0c;我們要知道它是怎么檢測的&#xff0c;找到他通過哪個JS的API來做的檢測&#xff0c;只有知道了如何檢測&#xff0c;我們…

Muduo網絡庫實現 [九] - EventLoopThread模塊

目錄 設計思路 類的設計 模塊的實現 私有接口 公有接口 設計思路 我們說過一個EventLoop要綁定一個線程&#xff0c;未來該EventLoop所管理的所有的連接的操作都需要在這個EventLoop綁定的線程中進行&#xff0c;所以我們該如何實現將EventLoop和線程綁定呢&#xff1f;…

UE5學習筆記 FPS游戲制作38 繼承標準UI

文章目錄 UE的UIUMG的繼承繼承標準控件創建標準控件繼承標準控件的用處 UE的UI 和Untiy有onGui和UGui類似&#xff0c;UE有slateUI和UMG,slateUI是早期只能用C編寫的UI&#xff0c;UMG是現在使用的&#xff0c;可以拖拽編輯的UI slateUI是UMG的父類 UMG的繼承 我們編寫一個控…

C#核心學習(七)面向對象--封裝(6)C#中的拓展方法與運算符重載: 讓代碼更“聰明”的魔法

目錄 一、什么是拓展方法&#xff1f; 二、拓展方法有啥用&#xff1f;怎么寫拓展方法&#xff1f; 1. ?核心用途 2. ?編寫步驟 實現步驟 關鍵點說明 關鍵規則 3. ?注意事項 三、什么是運算符重載&#xff1f; 四、運算符重載有啥用&#xff1f;怎么寫&#xff1f;…

銀行卡歸屬地查詢API接口如何對接?

銀行卡歸屬地查詢 API 接口是一種能讓開發者通過編程方式獲取銀行卡歸屬地等相關信息的工具。借助此接口&#xff0c;開發者可將銀行卡歸屬地查詢功能集成到自己的應用程序或系統里&#xff0c;像電商平臺、第三方支付公司等都能運用它來提升業務的準確性與安全性。 銀行卡歸屬…

ORM mybits mybits-plus

ORM ORM 即對象關系映射&#xff08;Object Relational Mapping&#xff09;&#xff0c;是一種程序設計技術&#xff0c;用于實現面向對象編程語言里不同類型系統的數據之間的轉換。下面從基本概念、工作原理、優勢與劣勢、常見的 ORM 框架等方面詳細介紹 ORM。 常見的orm框架…

網絡編程—網絡概念

目錄 1 網絡分類 1.1 局域網 1.2 廣域網 2 常見網絡概念 2.1 交換機 2.2 路由器 2.3 集線器 2.4 IP地址 2.5 端口號 2.6 協議 3 網絡協議模型 3.1 OSI七層模型 3.2 TCP/IP五層模型 3.3 每層中常見的協議和作用 3.3.1 應用層 3.3.2 傳輸層 3.3.3 網絡層 3.3.4…