当前位置: 首页 > news >正文

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.lryc.cn/news/248015.html

相关文章:

  • Java面向对象第7天
  • 网络安全如何自学?
  • Flink-时间窗口
  • 软件设计模式原则(三)单一职责原则
  • 使用Postman创建Mock Server
  • 【古月居《ros入门21讲》学习笔记】15_ROS中的坐标系管理系统
  • 初始linux:文件操作
  • iOS上传ipa使用可视化工具Transporter
  • 解读《陆奇最新演讲实录—我的大模型世界观》
  • ChatGPT到底是如何运作?
  • 学习Java第57天,Servlet的基本使用步骤
  • 解决:ValueError: must have exactly one of create/read/write/append mode
  • 大数据-之LibrA数据库系统告警处理(ALM-37014 Gaussdb进程锁文件已经存在)
  • STM32 基础知识
  • JVM——产生内存溢出原因
  • 关于X86机器上运行GnuCobol的研究
  • open与openat的区别
  • 人工智能与供应链行业融合:预测算法的通用化与实战化
  • Cytoscape学习教程
  • computed和watch相关
  • 反思一次效能提升
  • ElasticSearch之cat indices API
  • Composer update 跳过指定依赖
  • @RequestMapping详解:请求映射规则
  • C#中密封类和密封方法
  • Pytorch中的Net.train()和 Net.eval()函数讲解
  • 氪了几百亿,字节游戏停止了“跳动”
  • 进入docker容器
  • C陷阱与缺陷——第5章库函数
  • 【C++上层应用】6. 信号 / 中断