批处理脚本处理大文件校验列数据运行过慢无响应问题求助
批处理超大文件循环校验优化方案
性能瓶颈原因
原有脚本采用嵌套双循环设计:每遇到St列为(的行,就重新完整遍历一次整个输入文件,时间复杂度为O(n²)。当处理GB级大文件时,反复的磁盘IO和循环计算会导致程序长时间无响应,完全不适用大文件场景。
优化实现
优化思路:仅单次遍历文件,用环境变量作为哈希表维护待闭合的(Cy,Y)组合,遍历完成后直接输出未被闭合的组合即可,时间复杂度O(n),仅受磁盘读取速度限制,适配超大文件。
@echo off setlocal enableextensions enabledelayedexpansion :: 校验入参 if "%~1"=="" ( echo 请传入输入文件路径作为参数 exit /b 1 ) set "inputFile=%~1" :: 清空历史遗留的open_前缀变量 for /f "delims==" %%a in ('set open_ 2^>nul') do set "%%a=" :: 单次遍历文件,跳过前2行 for /f "skip=2 tokens=6,7,8 delims= " %%b in (%inputFile%) do ( set "Cy=%%b" set "St=%%c" set "Y=%%d" if "!St!"==")" ( :: 遇到闭合标记,清除对应待闭合记录 if defined open_!Cy!_!Y! ( set "open_!Cy!_!Y!=" ) ) else if "!St!"=="(" ( :: 遇到起始标记,新增待闭合记录 set "open_!Cy!_!Y!=1" ) ) :: 输出所有未正确闭合的Cy、Y值 for /f "tokens=2,3 delims=_" %%x in ('set open_ 2^>nul') do ( echo %%x %%y ) endlocal
适配说明
- 支持同一个(Cy,Y)组合存在多对开闭的场景,会自动匹配抵消,最终仅输出剩余未闭合的组合
- 全程仅一次文件读取,无额外磁盘IO开销,处理大文件速度提升可达数千倍
- 匹配你提供的示例输入,会正确输出
24 56的结果
内容的提问来源于stack exchange,提问作者Alexandra Laure
相关产品推荐
相关产品推荐

