GoLang Filepath.Walk遍歷優化

原生標準庫在文件量過大時效率和內存均表現不好

1400萬文件遍歷Filepath.Walk

在這里插入圖片描述

1400萬文件重寫直接調用windows api并處理細節

在這里插入圖片描述

結論

1400萬文件遍歷時對比

對比條目filepath.walkwindows api并觸發黑科技
運行時間710秒22秒
內存占用480M38M

關鍵代碼

//超級快的文件遍歷
func FindFileWin(dir string, callbackfunc MyFindFileCallBack) {dir = dir + `\`finstruct := win.WIN32_FIND_DATAW{}handle := win.FindFirstFileW(dir+`*`, &finstruct)if win.IsInvalidHandle(handle) {for {//文件夾if (finstruct.DwFileAttributes & win.FILE_ATTRIBUTE_DIRECTORY) != 0 {if (finstruct.CfileNameGo != "..") && (finstruct.CfileNameGo != ".") {FindFileWin(dir+finstruct.CfileNameGo, callbackfunc)}} else {callbackfunc(dir + finstruct.CfileNameGo)}if win.FindNextFileW(handle, &finstruct) == 0 {break}}}
}
var (kernel32           = syscall.NewLazyDLL("Kernel32.dll")procCreateFileW    = kernel32.NewProc("CreateFileW")procOpenEventW     = kernel32.NewProc("OpenEventW")procSetEvent       = kernel32.NewProc("SetEvent")procFindFirstFileW = kernel32.NewProc("FindFirstFileW")procFindNextFileW  = kernel32.NewProc("FindNextFileW")//procCreateFileA = kernel32.NewProc("CreateFileA")
)func FindFirstFileW(fileName string, lpFindFileData *WIN32_FIND_DATAW) HANDLE {strname := unsafe.Pointer(syscall.StringToUTF16Ptr(fileName))handle, _, _ := procFindFirstFileW.Call(uintptr(strname),uintptr(unsafe.Pointer(lpFindFileData)),)if handle != 0 {lpFindFileData.CfileNameGo = syscall.UTF16ToString(lpFindFileData.cFileName[:])}return HANDLE(handle)
}
func IsInvalidHandle(handle HANDLE) bool {if handle != 0 && int(handle) != -1 {return true}return false
}
func FindNextFileW(hFindFile HANDLE, lpFindFileData *WIN32_FIND_DATAW) BOOL {ret, _, _ := procFindNextFileW.Call(uintptr(hFindFile),uintptr(unsafe.Pointer(lpFindFileData)),)if ret != 0 {lpFindFileData.CfileNameGo = syscall.UTF16ToString(lpFindFileData.cFileName[:])}return BOOL(ret)
}

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

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

相關文章

【HuggingFace Transformer庫學習筆記】基礎組件學習:pipeline

一、Transformer基礎知識 pip install transformers datasets evaluate peft accelerate gradio optimum sentencepiece pip install jupyterlab scikit-learn pandas matplotlib tensorboard nltk rouge在host文件里添加途中信息,可以避免運行代碼下載模型時候報錯…

企業計算機服務器中了360勒索病毒怎么辦,360勒索病毒解密文件恢復

計算機技術的不斷發展,為企業的生產運營提供了極大便利,不僅提升了辦公效率,還促進了企業的發展。企業計算機在日常工作中一定加以防護,減少網絡威脅事件的產生,確保企業的生產生產運營。最近,網絡上的360后…

微信小程序富文本拓展rich-text

微信小程序富文本插件 功能介紹 支持解析<style>標簽中的全局樣式支持自定義默認的標簽樣式支持自動設置標題 若html中存在title標簽,將自動把title標簽的內容設置到頁面的標題上,并在回調bindparse中返回,可以用于轉發支持添加加載提示 可以在Parser標簽內添加加載提…

8:kotlin 類型檢查和轉換(Type checks and casts)

在運行時可以執行類型檢查以檢查對象的類型。類型轉換將對象強制轉換為不同的類型 is 和 !is 可以使用is或者!is來判斷實例是不是指定的類型 fun main() {var obj : Any "cast"if (obj is String) {println(obj.length) // 4}obj 123if (obj !is String) { pr…

動態規劃 之 鋼條切割

自頂向下遞歸實現(Recursive top-down implementation) 程序CUT-ROD對等式(14.2)進行了實現&#xff0c;偽代碼如下&#xff1a; CUT-ROD(p, n)if n 0return 0q -∞for i 1 to nq max{q, p[i] CUT-ROD(p, n - i)}return q上面解決中重復對一個子結構問題重復求解了&#…

Qt無邊框窗口設置陰影

//設置窗體透明this->setAttribute(Qt::WA_TranslucentBackground, true);//設置無邊框this->setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint);QVBoxLayout* pMainLay new QVBoxLayout(this);CLoginRealWidget* pRealWidget new …

VR全景展示,“超前點播”打開娛樂行業線上營銷門戶

如今&#xff0c;人們的生活水平正在逐步提高&#xff0c;這種提高不僅僅是體現在衣食住行上&#xff0c;更多方面是體現在大眾的娛樂活動上。我們可以看到&#xff0c;相比于過去娛樂種類的匱乏&#xff0c;現如今&#xff0c;各種娛樂活動可謂是百家爭鳴&#xff0c;例如溫泉…

目標檢測YOLO實戰應用案例100講-基于多光譜圖像融合的光伏組件故障 檢測

目錄 前言 國內外研究現狀 多光譜圖像配準研究現狀 光伏區域識別研究現狀

java學習part10 this

90-面向對象(進階)-關鍵字this調用屬性、方法、構造器_嗶哩嗶哩_bilibili 1.java的this java的this性質類似cpp的this&#xff0c; 但它是一種引用&#xff0c;所以用 this. xxx來調用。 this代表當前的類的實例&#xff0c;所以必須和某個對象結合起來使用&#xff0c;不能…

webrtc的RTCPeerConnection使用

背景&#xff1a; 平時我們很少會需要使用到點對點單獨的通訊&#xff0c;即p2p,一般都是點對服務端通訊&#xff0c;但p2p也有自己的好處&#xff0c;即通訊不經過服務端&#xff0c;從服務端角度這個省了帶寬和壓力&#xff0c;從客戶端角度&#xff0c;通訊是安全&#xff…

Javaweb之前端工程化的詳細解析

3 前端工程化 3.1 前端工程化介紹 我們目前的前端開發中&#xff0c;當我們需要使用一些資源時&#xff0c;例如&#xff1a;vue.js&#xff0c;和axios.js文件&#xff0c;都是直接再工程中導入的&#xff0c;如下圖所示&#xff1a; 但是上述開發模式存在如下問題&#xff…

git的使用:本地git下載、sshkey的添加、github倉庫創建及文件上傳

一、github創建賬號 即github注冊賬號&#xff0c;登錄github官網&#xff0c;根據提示注冊即可 github官網 二、git客戶端下載安裝 已有很多git下載安裝的博文了&#xff0c;在此就不贅述 三、sshkey的生成與添加 1、sshkey的生成以及查看 // sshkey的生成命令&#xff…

OSS+CDN的資費和安全

文章目錄 花費OSSCDNOSS CDN 安全OSS防盜鏈跨域設置CORS數據加密 CDN防盜鏈URL鑒權Cookie鑒權遠程鑒權IP黑白名單UA黑白名單 回源服務自定義私有參數IP黑白名單數據加密 花費 OSS 存儲費用 &#xff1a;0.12元/GB/月下行流量費用 &#xff1a;0.5元/GB請求費用 &#xff1a;…

java全局異常處理(springboot)

介紹&#xff1a; 在日常項目開發中&#xff0c;異常是常見的&#xff0c;但是如何更高效的處理好異常信息&#xff0c;讓我們能快速定位到BUG&#xff0c;是很重要的&#xff0c;不僅能夠提高我們的開發效率&#xff0c;還能讓你代碼看上去更舒服&#xff0c;SpringBoot的項目…

C語言你愛我么?(ZZULIOJ 1205:你愛我么?)

題目描述 LCY買個n束花準備送給她暗戀的女生&#xff0c;但是他不知道這個女生是否喜歡他。這時候一個算命先生告訴他讓他查花瓣數&#xff0c;第一個花瓣表示"愛"&#xff0c;第二個花瓣表示"不愛"&#xff0c;第三個花瓣表示"愛"..... 為了使最…

某60區塊鏈安全之未初始化的存儲指針實戰二學習記錄

系列文章目錄 文章目錄 系列文章目錄未初始化的存儲指針實戰二實驗目的實驗環境實驗工具實驗原理實驗內容實驗過程EXP利用 未初始化的存儲指針實戰二 實驗目的 學會使用python3的web3模塊 學會分析以太坊智能合約未初始化的存儲指針漏洞 找到合約漏洞進行分析并形成利用 實驗…

機器學習之自監督學習(四)MoCo系列翻譯與總結(二)

MoCo中相關工作的對比分析 去噪自動編碼器&#xff08;Denoising Autoencoder&#xff09;是一種用于學習數據表示的神經網絡模型。它的主要目標是通過去除輸入數據中的噪聲&#xff0c;學習到輸入數據的有用表示&#xff0c;從而提高模型對干凈數據的魯棒性。下面是對去噪自動…

Flink 常用物理分區算子(Physical Partitioning)

Flink 物理分區算子(Physical Partitioning) 在Flink中&#xff0c;常見的物理分區策略有&#xff1a;隨機分配(Random)、輪詢分配(Round-Robin)、重縮放(Rescale)和廣播(Broadcast)。 接下來&#xff0c;我們通過源碼和Demo分別了解每種物理分區算子的作用和區別。 (1) 隨機…

win10安裝pytorch(py39)

cuda≤11.6&#xff0c;觀察控制面板 觀察torch對應cuda版本 https://download.pytorch.org/whl/torch/ 安裝cuda11.6.0 CUDA Toolkit Archive | NVIDIA Developer cmd輸入nvcc -V 編輯國內鏡像源 .condarc anaconda prompt輸入 查看環境 conda env list 安裝py3.9…

uniapp視頻倍速播放插件,uniapp視頻試看插件——sunny-video使用文檔

sunny-video視頻倍速播放器 組件名&#xff1a;sunny-video 效果圖 img1img2img3img4 平臺差異說明 目前已應用到APP&#xff08;安卓、iOS&#xff09;、微信&#xff08;小程序、H5&#xff09;其它平臺未測試 安裝方式 本組件符合easycom規范&#xff0c;HBuilderX 2.5…