提高 Windows 的批处理脚本性能
Improve Windows's batch script performance
我想从文本文件中删除特定的行,使用这个命令:
for /f "delims=" %%d in ('"dir <Dir_Path> /a /b /s | sort"') do type %%d | findstr /V <String_To_Delete> > <%%d_Filtered.txt>
它正在运行,但非常非常慢。
如何改进命令或使其在多核中使用?
在您发布的命令行中,最慢的部分可能是 findstr
、sort
和 cmd 的管道管理。
findstr
大受欢迎。它需要读取每个整个文件,但这是练习的全部原因。如果不需要正则表达式支持,可以通过使用文字搜索字符串和 /L
参数来禁用正则表达式支持来稍微加快速度。如果可能,请尝试预先过滤您的文件列表以减少 findstr
必须解析的数据量。
sort
在你的命令行中除了改变你处理文件的顺序什么都不做,但是要这样做,它需要将整个文件列表读入内存并且 运行 对它们的排序算法。除非您有特定原因,文件必须按 directory/filename 的字母顺序处理,否则我将跳过此步骤。
使用 type
读取文件名,然后 运行 通过 CMD 管道读取数据,您可能会损失一些性能。直接让 findstr
读取文件而不是使用 STDIN 可能更快。
使用上面的建议,你的命令行变成
for /f "delims=" %%d in ('"dir <Dir_Path> /a /b /s"') do findstr /V /L [Literal_String] %%d > [%%d_Filtered.txt]
请注意,在优化时,您应该始终使用 timethis.exe
等工具来衡量您的表现,而不是仅仅接受网站上某个人的话。
我想从文本文件中删除特定的行,使用这个命令:
for /f "delims=" %%d in ('"dir <Dir_Path> /a /b /s | sort"') do type %%d | findstr /V <String_To_Delete> > <%%d_Filtered.txt>
它正在运行,但非常非常慢。 如何改进命令或使其在多核中使用?
在您发布的命令行中,最慢的部分可能是 findstr
、sort
和 cmd 的管道管理。
findstr
大受欢迎。它需要读取每个整个文件,但这是练习的全部原因。如果不需要正则表达式支持,可以通过使用文字搜索字符串和/L
参数来禁用正则表达式支持来稍微加快速度。如果可能,请尝试预先过滤您的文件列表以减少findstr
必须解析的数据量。sort
在你的命令行中除了改变你处理文件的顺序什么都不做,但是要这样做,它需要将整个文件列表读入内存并且 运行 对它们的排序算法。除非您有特定原因,文件必须按 directory/filename 的字母顺序处理,否则我将跳过此步骤。使用
type
读取文件名,然后 运行 通过 CMD 管道读取数据,您可能会损失一些性能。直接让findstr
读取文件而不是使用 STDIN 可能更快。
使用上面的建议,你的命令行变成
for /f "delims=" %%d in ('"dir <Dir_Path> /a /b /s"') do findstr /V /L [Literal_String] %%d > [%%d_Filtered.txt]
请注意,在优化时,您应该始终使用 timethis.exe
等工具来衡量您的表现,而不是仅仅接受网站上某个人的话。