在导入前重命名数百个文件,需要大幅加速
Renaming Hundreds of Files Prior to Import, Needs Drastic Speed Up
我们有一个导入,可以在实际导入任何数据之前重命名目录中的文件。它在我的机器上运行良好,但我们的一些用户有硬件限制,当文件数达到 500+ 运行ge 时,它开始变慢甚至完全停止(当然,用户没有提供错误) .
我已经大大加快了这个过程,但我觉得问题必须出在使用 "File.Move()" 重命名文件,必须有更好的解决方案,对吗?
代码(为匿名而删除客户名称):
For Each file In items
Dim fName As String = IO.Path.GetFileName(file)
If (Not fName.ToUpper.Contains("xxxxxxxx")) Then
rname.renameFile(ftpPath & "\", fName, CustomerName & "_" & fName)
End If
Next
重命名文件:
Public Sub renameFile(ByVal filePath As String, _
ByVal origfileName As String, _
ByVal newfileName As String)
Try
File.Move(filePath & origfileName, filePath & newfileName)
Catch ex As Exception
Throw New ArgumentException(ex.Message)
End Try
End Sub
我对代码所做的就是清理第一个块,它每次都使用 "IO.Path.GetFileName" 而不是仅仅将它命名为一个变量,我为自己节省了大约 9 秒的半秒在 707 个文件上,对于一个小改动来说还不错。
作为参考,我 运行 在文件已经包含所需的字符串并在 1 毫秒内完成所有这些之后再次编写代码。
编辑-(使用"My.Computer.FileSystem.RenameFile"的另一次尝试):
For Each file In items
Dim fName As String = IO.Path.GetFileName(file)
If (Not fName.ToUpper.Contains("xxxxxxxx")) Then
My.Computer.FileSystem.RenameFile(ftpPath & "\" & fName, CustomerName & "_" & fName)
End If
Next
这实际上变慢了,从 8,497 毫秒到 12,957 毫秒...哎呀。
你可以尝试一件事.. 如果各种机器都有多核处理器,你可以尝试像这样并行化循环。它可能不会产生太大的区别,但如果硬盘支持本机命令队列,那么可能会有一些好处。
Parallel.ForEach(items, Sub(file As String)
Dim fName As String = IO.Path.GetFileName(file)
If (Not fName.ToUpper.Contains("xxxxxxxx")) Then
renameFile(ftpPath & "\", fName, CustomerName & "_" & fName)
End If
End Sub)
我们有一个导入,可以在实际导入任何数据之前重命名目录中的文件。它在我的机器上运行良好,但我们的一些用户有硬件限制,当文件数达到 500+ 运行ge 时,它开始变慢甚至完全停止(当然,用户没有提供错误) .
我已经大大加快了这个过程,但我觉得问题必须出在使用 "File.Move()" 重命名文件,必须有更好的解决方案,对吗?
代码(为匿名而删除客户名称):
For Each file In items
Dim fName As String = IO.Path.GetFileName(file)
If (Not fName.ToUpper.Contains("xxxxxxxx")) Then
rname.renameFile(ftpPath & "\", fName, CustomerName & "_" & fName)
End If
Next
重命名文件:
Public Sub renameFile(ByVal filePath As String, _
ByVal origfileName As String, _
ByVal newfileName As String)
Try
File.Move(filePath & origfileName, filePath & newfileName)
Catch ex As Exception
Throw New ArgumentException(ex.Message)
End Try
End Sub
我对代码所做的就是清理第一个块,它每次都使用 "IO.Path.GetFileName" 而不是仅仅将它命名为一个变量,我为自己节省了大约 9 秒的半秒在 707 个文件上,对于一个小改动来说还不错。
作为参考,我 运行 在文件已经包含所需的字符串并在 1 毫秒内完成所有这些之后再次编写代码。
编辑-(使用"My.Computer.FileSystem.RenameFile"的另一次尝试):
For Each file In items
Dim fName As String = IO.Path.GetFileName(file)
If (Not fName.ToUpper.Contains("xxxxxxxx")) Then
My.Computer.FileSystem.RenameFile(ftpPath & "\" & fName, CustomerName & "_" & fName)
End If
Next
这实际上变慢了,从 8,497 毫秒到 12,957 毫秒...哎呀。
你可以尝试一件事.. 如果各种机器都有多核处理器,你可以尝试像这样并行化循环。它可能不会产生太大的区别,但如果硬盘支持本机命令队列,那么可能会有一些好处。
Parallel.ForEach(items, Sub(file As String)
Dim fName As String = IO.Path.GetFileName(file)
If (Not fName.ToUpper.Contains("xxxxxxxx")) Then
renameFile(ftpPath & "\", fName, CustomerName & "_" & fName)
End If
End Sub)