io.Copy 比调用 mv 命令慢很多

str*_*ner 3 windows go

似乎 io.Copy 对我来说很慢:

   _,err = io.Copy(destf,srcf)
Run Code Online (Sandbox Code Playgroud)

io.Copy 需要更长的时间,将 1GB 文件复制到网络共享大约需要 2 分钟。注意到 mv.exe 最多在大约 25 秒内完成工作 - 所以我已经开始为我的工作唤起 mv。

    output, err := exec.Command("mv", src, dest_folder).CombinedOutput()
Run Code Online (Sandbox Code Playgroud)

这种缓慢在我身上始终可以重现,任何有关如何加速的提示将不胜感激!

更新:

感谢您建议使用io.CopyBuffer(),但是mv.exe仍然以可观的优势成为唯一的胜利者。

细节:

PS C:\temp> .\move_files.exe .\testfile.data "\\somehost\somefolder\bleh13.txt"
2018/07/14 19:04:54 Created C:\Temp\2\deleteME__913153343, copy of .\testfile.data, Size: 1073745920 bytes
2018/07/14 19:05:55 Transfer with io.Copy() took us 60.836702 seconds
2018/07/14 19:06:47 Transfer with io.CopyBuffer() took us 50.729625 seconds
2018/07/14 19:06:59 Transfer with mv command took us 11.470456 seconds
PS C:\temp>
Run Code Online (Sandbox Code Playgroud)

欢迎您自己尝试:https : //play.golang.org/p/2_lR83A4BXe

Uve*_*tel 5

你比较复制和移动是不同的东西。移动文件并不假设将所有数据的副本写入新的物理内存目标,只需重写文件系统中的一些标头/描述符。所以为了适当的比较基准

  • mv 等效于 cp + rm,当跨不同磁盘完成时。在同一分区 mv 几乎是即时的。在 OP 示例中, mv 花费了 26 秒,因此不太可能在同一分区上。 (5认同)